Konwersje Lambda z niejasnym typem powrotu i rozdzielczością przeciążenia [duplikat]
To pytanie ma już tutaj odpowiedź:
Specyficzna rozdzielczość przeciążenia z while (true) 1 odpowiedźJeśli mam lambdę taką jak() => { throw new Exception(); }
, nie jest jasne, czy ma typ powrotu, czy nie. Z tego powodu może być (niejawnie) przekonwertowany na obaAction
iFunc<object>
(lub jakikolwiek innyFunc<T>
). Dzieje się tak, ponieważ zgodnie z §6.5Konwersje funkcji anonimowych specyfikacji C # 4:
[A] typ delegataD
jest kompatybilny z funkcją anonimowąF
opatrzony:
…
JeśliD
mavoid
typ powrotu i treśćF
jest blokiem oświadczeń, gdy […] treśćF
jest prawidłowym blokiem instrukcji, w którym żadna instrukcja return nie określa wyrażenia.
JeśliD
ma typ nie-pustego powrotu i treśćF
jest blokiem oświadczeń, gdy […] treśćF
jest prawidłowym blokiem instrukcji z nieosiągalnym punktem końcowym, w którym każdyreturn
instrukcja określa wyrażenie, które jest niejawnie konwertowane na typ zwracanyD
.
Ale jeśli mam dwa przeciążenia metody, gdzie jeden ma parametr typuAction
i inniFunc<object>
i przekazuję mu lambdę z góry,Func<object>
używane jest przeciążenie. Czemu? Która część specyfikacji mówi takFunc<object>
jest lepszy niżAction
w tym przypadku?
Spojrzałem na §7.5.3.2Lepszy członek funkcji, ale to nie wyjaśnia tego.