Si tengo una lambda como () => { throw new Exception(); }
, no está claro si tiene un tipo de devolución o no. Debido a esto, puede convertirse (implícitamente) en Action
y Func<object>
(o en cualquier otro Func<T>
). Esto se debe a que, de acuerdo con el apartado 6.5 conversiones función anónima de la especificación C# 4:Conversiones de Lambda con un tipo de retorno no claro y resolución de sobrecarga
[A] delegado tipo
D
es compatible con una función anónimaF
proporcionado:
...
Si
D
tiene un tipo de devoluciónvoid
y el cuerpo deF
es un bloque de instrucciones, cuando [...] el cuerpo deF
es un bloque de instrucción válido en el que ninguna instrucción de retorno especifica una expresión.Si
D
tiene un tipo de retorno no nulo y el cuerpo deF
es un bloque de instrucciones, cuando [...] el cuerpo deF
es un bloque de instrucciones es válido con un punto extremo no alcanzable en el que cada unoreturn
especifica los estados una expresión que es implícitamente convertible al tipo de devolución deD
.
Pero si tengo dos sobrecargas de un método, donde uno tiene un parámetro de tipo Action
y el otro Func<object>
, y lo paso la lambda desde arriba, se utiliza la sobrecarga Func<object>
. ¿Por qué? ¿Qué parte de la especificación dice que Func<object>
es mejor que Action
en este caso?
He examinado §7.5.3.2 Mejor miembro de función, pero eso no lo explica.
Y si, en lugar de la sintaxis lambda, se utiliza la notación 'delegate {throw new Exception(); } 'donde dejas fuera la lista de parámetros en'() 'paréntesis, esa función anónima podría coincidir con ** cualquier ** firma delegada, supongo, incluyendo también p. ej. 'EventHandler' y' Action
@JeppeStigNielsen Sí. En ese caso, no existe una regla para eliminar la ambigüedad como parámetros del método, por lo que obtendría un error de compilación. – svick