2

当店Firstには、Linq の機能を実際に実行する拡張メソッドを提供するコア ライブラリがありますFirstOrDefault。私たちのメソッドは、Linq を利用する前に使用されていました。Linq 参照は後で追加されましたが、追加しても問題は発生しませんでした。Firstコアを使用するアプリケーションは、同じ名前の Linq メソッドと比較して、引き続きメソッドを呼び出して取得することができました。最近、コアが1か月以上の変更で構築されたときに、これが変わりました。Firstカスタム バージョンではなく、Linq のバージョンに解決されるようになりました。

拡張メソッドのポイントは、修飾しないことです。あなたが呼ぶ

PeopleTable.Rows.OfType(Of DataRow)().First

それ以外の

utlCore.First(PeopleTable.Rows.OfType(Of DataRow)())

そのため、名前空間を修飾するためにコードを再検討することは実際的ではありません。競合をなくして単純に を使用するためにコアをレトロ化するのは理にかなっていることはわかっていますがFirstOrDefault、それはより大きく、後で行う必要があります。

明らかに、これらの拡張メソッドの解決方法には優先順位が付けられています。この優先順位付けがうまくいかない原因となる変更があったかどうかはわかりません。どこから探し始めますか?何が原因でしょうか?

4

1 に答える 1

0

「ハック」を介して拡張メソッドを「有効にした」と推測します。ExtensionAttributeこれは、LINQではなく拡張メソッドを使用する方法です...

この問題が発生している理由については、新しいコードのどこかにこれを含めた可能性があります。

using System.Linq;

それがSystem.Linq.Enumerable範囲に入るので、あなたFirstとLinqの間にあいまいさがありますFirst-名前空間のエイリアシングでこれを制御できます...これは使い捨ての例です:

using System;
using System.Collections.Generic;
// don't add this, lest you bring it in
//using System.Linq;
using Linq = System.Linq.Enumerable;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var values = new List<int>(Linq.Range(0, 10));
            var useLinqFirst = Linq.First(values);
            Console.WriteLine("LINQ First(): {0}", useLinqFirst);
            var useMyFirst = values.First();
            Console.WriteLine("My First(): {0}", useMyFirst);
            Console.ReadLine();
        }
    }

    public static class Ext
    {
        public static T First<T>(this IEnumerable<T> src)
        {
            Console.WriteLine("Using my First!");
            var e = src.GetEnumerator();
            while (e.MoveNext())
            {
                return e.Current;
            }
            return default(T);
        }
    }
}

正直なところ、私は LINQ のFirst\を使用するように改造したいと思いFirstOrDefaultます。長い目で見ればはるかに安全です。なぜなら、誰かが Linq 名前空間を含めることができないことをどこかで忘れてしまい、同じ状況に戻ってしまうからです。

于 2013-06-28T17:10:41.817 に答える