Лямбда-преобразования с неясным типом возврата и разрешением перегрузки [дубликаты]
This question already has an answer here:
Peculiar overload resolution with while (true) 1 answerЕсли у меня есть лямбда, такая как() => { throw new Exception(); }
, неясно, имеет ли он тип возвращаемого значения или нет. Из-за этого, это может быть (неявно) преобразовано в обаAction
а такжеFunc<object>
(или любой другойFunc<T>
). Это потому, что в соответствии с & 6.5;Anonymous function conversions спецификации C # 4:
[A] delegate type D
is compatible with an anonymous function F
provided:
…
If D
has a void
return type and the body of F
is a statement block, when […] the body of F
is a valid statement block in which no return statement specifies an expression.
If D
has a non-void return type and the body of F
is a statement block, when […] the body of F
is a valid statement block with a non-reachable end point in which each return
statement specifies an expression that is implicitly convertible to the return type of D
.
Но если у меня есть две перегрузки метода, где один имеет параметр типаAction
и другиеFunc<object>
и я передаю лямбду сверху,Func<object>
перегрузка используется. Зачем? Какая часть спецификации говорит, чтоFunc<object>
лучше, чемAction
в этом случае?
Я посмотрел на & # xA7; 7.5.3.2Better function member, но это не объясняет этого.