为什么速记lambda表达式仅在某些情况下有效?

use*_*eve 2 c# linq lambda

例如,这两个语句都检查字符串的每个字符以查看它是否为数字

 “abc3def".Any(c => char.IsDigit(c));
 "abc3def".Any(char.IsDigit);
Run Code Online (Sandbox Code Playgroud)

第二个语句如何工作,我还能在哪里使用这样的速记表达式.它似乎并不适用于所有情况.我没有遇到任何其他例子?

Ere*_*mez 6

在c#中,如果方法组char.IsDigit匹配,则编译器可以隐式地将方法组(例如)转换为委托.这称为"方法组转换"(您可以谷歌).

在这种情况下string.Any有一个重载接受一个Func<char, bool>(一个接受char并返回一个的委托bool)char.IsDigit匹配该签名(它需要一个char并返回一个bool).因此,编译器能够隐式转换char.IsDigitFunc<char, bool>.