Vielleicht ein wenig schwierig, aber ich frage mich warum. In System.Linq.Enumerable.cs
von System.Core.dll
haben wir:Erweiterungsmethoden und Kompilierzeitüberprüfung
public static int Count<TSource>(this IEnumerable<TSource> source);
In meinem Code mache ich etwas Böses:
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();
}
}
Wenn ich CommentedExtensions
Kommentar-, werde ich einen Compiler-Fehler erhalten sagen: „Dieser Aufruf mehrdeutig blabla ist " wie erwartet. Aber warum habe ich diesen Fehler nicht gleich beim ersten Mal bekommen? Es ist auch mehrdeutig!
BEARBEITEN Nach einem anderen Test habe ich festgestellt, dass ich keine Kompilierfehler bekomme, wenn die Erweiterungsmethoden in verschiedenen Namespaces sind, auch wenn sie vollständig identisch sind. Warum ist es erlaubt? Es bringt mehrdeutigen Aufruf von Methoden in C#.
EDIT2 Ich weiß in der Tat die beiden Count
sind in IL unterschiedlich. In der Tat ruft es
Enumerable.Count(Enumerable.Range(0,10))
und meine bösen Extension-Methode ruft:
MyExtension.Count(Enumerable.Range(0,10))
so sie anders sind. Aber trotzdem denke ich, dass es ein schlechter Geruch ist. Haben wir "echte" Erweiterungsmethoden? was kann das böse Verhalten verhindern?