簡體   English   中英

為LINQ to Objects定義自己的Where-Method - 我怎么知道哪一個會被使用?

[英]Defining my own Where-Method for LINQ to Objects - How do I know which one will get used?

出於測試原因,我為Linq定義了自己的Where-Method,如下所示:

namespace Test
{
    public static class LinqTest
    {
        public static IEnumerable<TSource> Where<TSource>(
                        this IEnumerable<TSource> source,
                        Func<TSource, bool> predicate)
        {
            return new List<TSource> { };
        }
    }
}

所以如果我使用這樣的查詢,我永遠不會得到一個結果:

    var test = new string[]{ "a", "b", "c" };
    var x = from y in test
            where y.Length > 0
            select y;
    foreach (var element in x)
        Console.WriteLine(element);

我的問題是:編譯器如何知道應該調用哪個擴展方法? LINQ中包含的那個,還是用戶定義的?

干杯,克里斯

擴展方法的規則類似於普通方法調用查找的規則。 簡短版本是編譯器將找到所有可訪問的名稱和擴展方法,並選擇其中最佳匹配(非擴展方法優於擴展方法)。

就像普通方法一樣,盡管選擇使用哪種擴展方法可能是模棱兩可的。 如果在應用程序中使用了System.LinqTest命名空間,則會出現這種情況。 根據您的信息,聽起來測試命名空間不會被using因此不會被考慮,Linq版本會勝出。

注意:以上是查找如何發生的摘要,絕不是確定的。 C#語言規范是這里的權威,並且更詳細地介紹了它。

通常,如果聲明沖突擴展,則在嘗試使用它時會出現編譯器錯誤。 但是,顯然如果擴展名在同一名稱空間中定義,則優先級不會出現錯誤甚至是警告。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM