我刚看到以下答案:Is there a better way to create acronym from upper letters in C#?,它有以下代码:
string.Join("", s.Where(char.IsUpper));
char.IsUpper
如何在这里工作? (而不是x => char.IsUpper(x)
)
答案 0 :(得分:10)
char.IsUpper
是一个方法组,它本身需要char
并返回bool
,因此它是与Where()
一起使用的有效谓词。
代码按名称引用方法的方式与指定委托时使用任何其他方法的方式非常相似,而不是直接调用它,因此括号不是必需的。
如果将它包装在lambda表达式x => char.IsUpper(x)
中,则必须使用括号 ,因为你调用方法并返回结果,< em>在表达式中。
答案 1 :(得分:3)
char.IsUpper
是指method group,它通过隐式转换传递给Where
函数作为类型代理,您可以在Eric Lippert的Covariance and Contravariance in C#, Part Three: Method Group Conversion Variance文章中阅读
答案 2 :(得分:1)
我相信char.IsUpper
(没有括号)求值为对方法的引用,可以作为谓词传递。如果添加了括号,那么只会立即调用该方法并尝试传递结果而不是传递方法本身。
答案 3 :(得分:0)
Where<char>
将Func<char, bool>
作为参数。使用x => char.isUpper(x)
,您要创建Func
使用的新Where
。但是,toUpper
方法需要char
,并返回bool
。因此,它可以直接用作Where
的参数。