看看我试图在构造函数中编写的以下代码:
private Predicate<string> _isValid;
//...
Predicate<string> isValid = //...;
this._isValid = isValid ?? s => true;
代码无法编译 - 只是“无效的表达式术语”等等。
相比之下,编译并且我可以使用它:
this._isValid = isValid ?? new Predicate<string>(s => true);
但是,我仍然想知道为什么不允许这种语法。
有什么想法吗?
答案 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-expression
以conditional-or-expression
终止,因此示例中的s
将解析为simple-name
。通过将其包装在括号中,然后可以将其解析为parenthesized-expression
。