Возможно, немного сложно, но мне интересно, почему. В 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
, я получаю ошибку компиляции, говоря «это вызов неоднозначен блаб " как и ожидалось. Но почему я впервые не получил эту ошибку? Это также неоднозначно!
EDIT После еще одного теста я обнаружил, что не буду получать ошибки компиляции, если методы расширения находятся в разных пространствах имен, даже если они полностью совпадают. Почему это разрешено? Это вызывает неоднозначный вызов методов в C#.
EDIT2 Я знаю, что на самом деле два Count
отличаются друг от друга. На самом деле это звонит
Enumerable.Count(Enumerable.Range(0,10))
и мой злой метод расширения звонит:
MyExtension.Count(Enumerable.Range(0,10))
так они разные. Но все же я думаю, что это плохой запах. Есть ли у нас «реальные» методы расширения? который может предотвратить злобное поведение?