Tener estas definiciones básicassimple expresión LINQ no se compilará
bool MyFunc(string input)
{
return false;
}
var strings = new[] {"aaa", "123"};
Me pregunto por qué esto no se compilará:
var b = strings.Select(MyFunc);
pero esto:
var c = strings.Select(elem => MyFunc(elem));
El mensaje de error es "Los argumentos de tipo para el método 'System.Linq.Enumerable.Select (System.Collections.Generic.IEnumerab le, System.Func) 'no se puede deducir del uso ".
La punta de error ReSharper dice que está confundido entre
Select(this IEnumerable<string>, Func<string, TResult>)
y
Select(this IEnumerable<string>, Func<string, int, TResult>)
... pero la firma de MyFunc está claro - sólo se necesita un parámetro (cadena).
¿Alguien puede arrojar algo de luz aquí?
Por lo tanto, * no era * no razonable de que yo creo que el compilador resolvería las cosas ... –
@Cristi: No ...aunque tratar de discernir a partir de las especificaciones exactamente cómo debería funcionar es complicado. Pienso en la parte de inferencia de tipo de la especificación que tiene "Here be dragons" escrito por todas partes. –
Decidimos cambiar el comportamiento cuando resultó demasiado tarde para obtener el cambio a C# 3, por lo que lo pusimos en C# 4 en su lugar. –