【发布时间】:2015-02-24 14:49:33
【问题描述】:
我从https://msdn.microsoft.com/en-us/library/vstudio/bb383977.aspx 读到,与基本类型上的现有方法具有相同名称和签名的扩展方法永远不会被调用,但是“覆盖”扩展方法本身呢:
using System;
using System.Linq;
using System.Collections.Generic;
namespace ConsoleApplication1
{
public class Program
{
public static void Main(string[] args)
{
var query = (new[] { "Hans", "Birgit" }).Where(x => x == "Hans");
foreach (var o in query) Console.WriteLine(o);
}
}
public static class MyClass
{
public static IEnumerable<T> Where<T>(this IEnumerable<T> source, Func<T, bool> predicate)
{
foreach (var obj in source)
if (predicate(obj)) yield return obj;
}
};
}
当我调试这个程序时,我确实遇到了我自己的扩展方法,而不是 System.Linq 提供的扩展方法(尽管包括命名空间)。我是否遗漏了什么,或者扩展方法是否也有优先级?
【问题讨论】:
-
您没有显示您的
using指令(IEnumerable<>需要在范围内),或者您是否声明了namespace。这可能是相关的。例如,您是否在namespace System.Linq { }中编写代码?你的using指令是放在System.Linq内部还是外部namespace? -
@JeppeStigNielsen 添加了命名空间
-
在上面(编辑的)代码中,首先搜索命名空间
ConsoleApplication1,然后是全局(null)命名空间,然后是System、System.Linq和System.Collections.Generic。由于MyClass在命名空间ConsoleApplication1中,所以先找到。
标签: c# extension-methods