Belki biraz zor, ama nedenini merak ediyorum. System.Core.dll
ait System.Linq.Enumerable.cs
biz var:Eklenti yöntemleri ve derleme zamanı denetimi
public static int Count<TSource>(this IEnumerable<TSource> source);
: Ben CommentedExtensions
yorumsuz, ben "diyerek bir derleme hatası alırsınız
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();
}
}
bu çağrı belirsiz blabla olduğunu " beklenildiği gibi. Ama bu hatayı ilk defa neden alamadım? Ayrıca belirsiz!
EDIT Başka bir testten sonra, uzantı yöntemleri farklı ad alanlarında olsalar bile derleme hataları almayacağımı, hatta tamamen aynı olduklarını fark ettim. Neden izin verilir? C# içinde belirsiz bir yöntem çağrısı getiriyor.
EDIT2 Aslında iki Count
'un IL'de farklı olduğunu biliyorum. Aslında
Enumerable.Count(Enumerable.Range(0,10))
aradığını ve benim kötü uzatma yönteminin çağırdığı:
MyExtension.Count(Enumerable.Range(0,10))
yüzden farklı. Ama yine de bence kötü bir koku. "Gerçek" uzatma yöntemleri var mı? kötülük davranışını önleyebilir?