Se si dispone di una lambda come () => { throw new Exception(); }
, non è chiaro se ha un tipo di ritorno o meno. Per questo motivo, può essere (implicitamente) convertito in entrambi Action
e Func<object>
(o qualsiasi altro Func<T>
). Questo perché, secondo il punto 6.5 anonimi conversioni funzione del C# 4 spec:Conversioni lambda con tipo di ritorno non chiaro e risoluzione di sovraccarico
[A] delegato tipo
D
è compatibile con una funzione anonimaF
condizione:
...
Se
D
ha un tipo di ritornovoid
e il corpo diF
è un blocco di istruzioni, quando il [...] corpo diF
è un blocco di istruzioni valido in cui nessuna istruzione return specifica un'espressione.Se
D
ha un tipo di ritorno non nullo e il corpo diF
è un blocco di istruzioni, quando [...] il corpo diF
è un blocco di istruzioni valido con un punto finale non raggiungibile in cui ognireturn
specifica istruzione un'espressione che è implicitamente convertibile nel tipo restituito diD
.
Ma se devo due overload di un metodo, in cui si ha un parametro di tipo Action
e l'altra Func<object>
, e lo passo lambda dall'alto, viene usato in sovraccarico Func<object>
. Perché? Quale parte della specifica dice che Func<object>
è meglio di Action
in questo caso?
Ho visto §7.5.3.2 Membro di funzione migliore, ma questo non lo spiega.
E se, invece di sintassi lambda, si utilizza la notazione 'delegate {throw new Exception(); } 'dove si omette la lista dei parametri tra parentesi'() ', quella funzione anonima potrebbe corrispondere a ** qualsiasi ** firma delegata che immagino, includendo anche per es. 'EventHandler' e' Azione '. –
@JeppeStigNielsen Sì. In tal caso, non c'è davvero alcuna regola per disambigarli come parametri del metodo, in modo da ottenere un errore di compilazione. – svick