[英]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.Linq
和Test
命名空間,則會出現這種情況。 根據您的信息,聽起來測試命名空間不會被using
因此不會被考慮,Linq版本會勝出。
注意:以上是查找如何發生的摘要,絕不是確定的。 C#語言規范是這里的權威,並且更詳細地介紹了它。
通常,如果聲明沖突擴展,則在嘗試使用它時會出現編譯器錯誤。 但是,顯然如果擴展名在同一名稱空間中定義,則優先級不會出現錯誤甚至是警告。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.