3

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

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

这里的工作怎么样char.IsUpper?(而不是x => char.IsUpper(x)

4

4 回答 4

10

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

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

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

于 2013-08-08T16:37:33.167 回答
3

char.IsUpper指的是通过隐式转换作为类型化委托传递给函数的方法组,您可以在 Eric Lippert撰写的 C# 中的协变和逆变,第 3 部分:方法组转换方差文章中阅读。Where

于 2013-08-08T16:38:26.433 回答
1

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

于 2013-08-08T16:40:28.040 回答
0

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

于 2013-08-08T16:44:49.013 回答