“char.IsUpper”(没有括号)如何工作?

时间:2013-08-08 16:34:44

标签: c# .net

我刚看到以下答案: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)

4 个答案:

答案 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的参数。