Tal vez un poco complicado, pero me pregunto por qué. En System.Linq.Enumerable.cs
de System.Core.dll
tenemos:Métodos de extensión y verificación en tiempo de compilación
public static int Count<TSource>(this IEnumerable<TSource> source);
en mi código que estoy haciendo algo mal:
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();
}
}
Si Descomentar CommentedExtensions
, voy a conseguir un error de compilación diciendo "esta llamada es ambigua blabla " como se esperaba. ¿Pero por qué no obtuve este error la primera vez? ¡También es ambiguo!
EDITAR Después de otra prueba, me di cuenta que no vamos a obtener errores de compilación si los métodos de extensión están en diferentes espacios de nombres, incluso ellos son totalmente iguales. ¿Por qué está permitido? Trae una llamada ambigua de métodos en C#.
Edit2 sé, de hecho, los dos son diferentes en Count
IL. De hecho, se llama
Enumerable.Count(Enumerable.Range(0,10))
y mi método de extensión del mal está llamando:
MyExtension.Count(Enumerable.Range(0,10))
por lo que son diferentes. Pero aún creo que es un mal olor. ¿Tenemos métodos de extensión "reales"? que puede prevenir el mal comportamiento?