也許有點棘手,但我不知道爲什麼。在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))
所以它們是不同的。但我認爲這是一種難聞的氣味。我們是否有「真正的」擴展方法?哪些可以防止惡意行爲?