如何“;烧焦IsUpper”;(没有括号)工作

本文关键字:工作 烧焦 IsUpper 如何 | 更新日期: 2023-09-27 18:26:50

我刚刚看到了以下答案:有没有更好的方法从C#中的大写字母创建首字母缩略词?它有以下代码:

string.Join("", s.Where(char.IsUpper));

char.IsUpper在这里是如何工作的?(代替x => char.IsUpper(x)

如何“;烧焦IsUpper”;(没有括号)工作

char.IsUpper是一个方法组,它本身接受char并返回bool,因此它是与Where()一起使用的有效谓词。

代码按名称引用方法的方式与指定委托时使用任何其他方法的方式非常相似,而不是直接调用它,因此不需要使用括号。

如果将圆括号包装在lambda表达式x => char.IsUpper(x)中,则它是必需的,因为调用方法并返回结果,表达式中。

char.IsUpper指的是一个方法组,该方法组通过隐式转换作为类型委托传递给Where函数,您可以在Eric Lippert的C#第三部分:方法组转换方差文章中阅读该隐式转换。

我相信char.IsUpper(不带括号)的计算结果是对该方法的引用,该引用可以作为谓词传递。如果添加括号,则会立即调用该方法并尝试传递结果,而不是传递方法本身。

Where<char>Func<char, bool>作为参数。通过使用x => char.isUpper(x),您将创建一个新的FuncWhere使用。但是,toUpper方法采用char,并返回bool。因此,它可以直接用作Where的参数。