也许有点棘手,但我不知道为什么。在System.Core.dll
System.Linq.Enumerable.cs
我们:扩展方法和编译时检查
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
,我会得到一个编译错误说:“这个调用暧昧布拉布拉“如预期。但为什么我第一次没有得到这个错误?它也含糊不清!
编辑经过另一次测试后,我发现如果扩展方法在不同的命名空间中,即使它们完全相同,我也不会收到编译错误。为什么允许?它在c#中引入了模糊的方法调用。
EDIT2我知道其实这两个Count
在IL中是不同的。事实上,它的呼唤
Enumerable.Count(Enumerable.Range(0,10))
和我的邪恶扩展方法是调用:
MyExtension.Count(Enumerable.Range(0,10))
所以它们是不同的。但我认为这是一种难闻的气味。我们是否有“真正的”扩展方法?哪些可以防止恶意行为?