【发布时间】:2010-10-13 06:11:57
【问题描述】:
也许有点棘手,但我想知道为什么。在System.Linq.Enumerable.cs 的System.Core.dll 中,我们有:
public static int Count<TSource>(this IEnumerable<TSource> source);
在我的代码中,我正在做一些邪恶的事情:
namespace Test
{
public static class Extensions
{
public static int Count<TSource>(this IEnumerable<TSource> source)
{
return -1; //evil code
}
}
//commented temporarily
//public static class CommentedExtensions
//{
// public static int Count<TSource>(this IEnumerable<TSource> source)
// {
// return -2; //another evil code
// }
//}
public static void Main(string[] args)
{
Console.WriteLine(Enumerable.Range(0,10).Count()); // -1, evil code works
Console.Read();
}
}
如果我取消注释CommentedExtensions,我会得到一个编译错误,如预期的那样“这个调用是模棱两可的blabla”。但是为什么我第一次没有收到这个错误?也很暧昧!
EDIT 经过另一次测试,我发现如果扩展方法在不同的命名空间中,我不会出现编译错误,即使它们完全一样。为什么是允许的?它在 c# 中带来了模棱两可的方法调用。
EDIT2 我知道实际上这两个Count 在IL 中是不同的。事实上它正在调用
Enumerable.Count(Enumerable.Range(0,10))
我邪恶的扩展方法正在调用:
MyExtension.Count(Enumerable.Range(0,10))
所以它们是不同的。但我仍然认为这是一种难闻的气味。我们有“真正的”扩展方法吗?哪些可以防止作恶?
【问题讨论】:
标签: c# .net linq extension-methods