Null-coalescing运算符和lambda表达式

时间:2010-07-10 06:37:19

标签: c# .net lambda null-coalescing-operator

看看我试图在构造函数中编写的以下代码:

private Predicate<string> _isValid;

//...

Predicate<string> isValid = //...;
this._isValid = isValid ?? s => true;

代码无法编译 - 只是“无效的表达式术语”等等。

相比之下,编译并且我可以使用它:

this._isValid = isValid ?? new Predicate<string>(s => true);

但是,我仍然想知道为什么不允许这种语法。

有什么想法吗?

2 个答案:

答案 0 :(得分:11)

this._isValid = isValid ?? (s => true);

会工作:)

它以这种方式解析:

this._isValid = (isValid ?? s) => true;

这没有任何意义。

答案 1 :(得分:1)

查看C#语法的这一部分:

parenthesized-expression:
    (   expression   )

.....

simple-name:
    identifier   type-argument-listopt

.....

conditional-or-expression:
    conditional-and-expression
    conditional-or-expression   ||   conditional-and-expression

null-coalescing-expression:
    conditional-or-expression
    conditional-or-expression   ??   null-coalescing-expression

conditional-expression:
    null-coalescing-expression
    null-coalescing-expression   ?   expression   :   expression

lambda-expression:
    anonymous-function-signature   =>   anonymous-function-body

由于null-coalescing-expressionconditional-or-expression终止,因此示例中的s将解析为simple-name。通过将其包装在括号中,然后可以将其解析为parenthesized-expression