我刚刚看到以下答案:有没有更好的方法可以在 C# 中从大写字母创建首字母缩写词?它有以下代码:
string.Join("", s.Where(char.IsUpper));
这里的工作怎么样char.IsUpper
?(而不是x => char.IsUpper(x)
)
我刚刚看到以下答案:有没有更好的方法可以在 C# 中从大写字母创建首字母缩写词?它有以下代码:
string.Join("", s.Where(char.IsUpper));
这里的工作怎么样char.IsUpper
?(而不是x => char.IsUpper(x)
)
char.IsUpper
是一个方法组,它本身接受 achar
并返回 a bool
,因此它是与 . 一起使用的有效谓词Where()
。
代码通过名称引用该方法,其方式与您在指定委托时使用任何其他方法的方式非常相似,而不是直接调用它,因此不需要括号。
如果您将其包装在 lambda 表达式中,则括号是x => char.IsUpper(x)
必需的,因为您在表达式中调用该方法并返回结果。
char.IsUpper
指的是通过隐式转换作为类型化委托传递给函数的方法组,您可以在 Eric Lippert撰写的 C# 中的协变和逆变,第 3 部分:方法组转换方差文章中阅读。Where
我相信char.IsUpper
(不带括号)评估对方法的引用,可以作为谓词传递。如果您添加了括号,那只会立即调用该方法并尝试传递结果,而不是传递方法本身。
Where<char>
将 aFunc<char, bool>
作为参数。通过使用x => char.isUpper(x)
,您正在创建一个新Func
的供Where
. 但是,该toUpper
方法采用 achar
并返回 a bool
。因此,它可以直接用作 的参数Where
。