Un lambda como (int a) => a
se ajustan a cualquier delegado que toma un int
y devuelve un int
. Func<int,int>
es solo un ejemplo, y puede declarar uno fácilmente con delegate int Foo(int x);
. De hecho, esta expresión lambda incluso se ajusta a un delegado que toma un int
y devuelve un double
, porque el resultado de la lambda (a
) es implícitamente convertible a double
.
Para que una lambda se pueda asignar a todos los tipos de delegados que caben, la lambda en sí misma no tiene un tipo. En cambio, toma el tipo de delegado en el que lo está usando, siempre que sea posible. ((int a) => a
no se pueden asignar a Func<byte, byte>
por supuesto.)
Mientras tanto Func<int, int>
y el delegado Foo
he definido por supuesto, puede ser convertido en Delegate
, un lambda no se puede convertir directamente a Delegate
porque no está claro cuál es su real la firma sería entonces. Después de Delegate d = (int a) => a
, ¿d
sería Foo
, o Func<int, int>
, o incluso Func<int, double>
? Todas son posibilidades válidas, y el compilador no tiene idea de lo que pretendía. Podría hacer una mejor suposición, pero C# no es el tipo de lenguaje que hace ese tipo de conjeturas. Esta es también la razón por la que no puede hacer algo como var = (int a) => a
.
creo que el mensaje de error que el compilador da para Delegate d = (int a) => a;
es muy claro:
Cannot convert lambda expression to type 'System.Delegate' because it is not a delegate type
Intuitivamente se podría pensar Delegate
es un tipo de delegado, pero no es así como funcionan las cosas. :)
Fyi, cuando algo no se puede compilar, lea (y publique) el mensaje de error también. –
@SharePoint Novato: por favor vea mi publicación actualizada. Eso debería resolver tu error ahora. – Noldorin