Conversões lambda com tipo de retorno pouco claro e resolução de sobrecarga [duplicado]
Esta questão já tem uma resposta aqui:
Resolução de sobrecarga peculiar com while (true) 1 respostaSe eu tiver um lambda como() => { throw new Exception(); }
, não está claro se tem um tipo de retorno ou não. Por causa disso, ele pode ser (implicitamente) convertido emAction
eFunc<object>
(ou qualquer outroFunc<T>
). Isso porque, de acordo com o §6.5Conversões de função anônima da especificação C # 4:
[A] tipo de delegadoD
é compatível com uma função anônimaF
forneceu:
…
E seD
tem umvoid
tipo de retorno e o corpo deF
é um bloco de declaração, quando […] o corpo deF
é um bloco de instrução válido no qual nenhuma instrução de retorno especifica uma expressão.
E seD
tem um tipo de retorno não nulo e o corpo deF
é um bloco de declaração, quando […] o corpo deF
é um bloco de instrução válido com um ponto final não alcançável em que cadareturn
instrução especifica uma expressão que é implicitamente conversível para o tipo de retornoD
.
Mas se eu tenho duas sobrecargas de um método, onde se tem um parâmetro do tipoAction
e o outroFunc<object>
, e eu passo o lambda de cima, oFunc<object>
sobrecarga é usada. Por quê? Qual parte da especificação diz queFunc<object>
é melhor queAction
nesse caso?
Eu olhei para §7.5.3.2Melhor membro de função, mas isso não explica isso.