12

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

private Predicate<string> _isValid;

//...

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

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

相比之下,它确实可以编译,我可以使用它:

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

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

有任何想法吗?

4

2 回答 2

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

将工作 :)

它是这样解析的:

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

这没有任何意义。

于 2010-07-10T06:41:25.630 回答
3

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

括号表达式:
    ( 表达 )

......

简单名称:
    标识符类型参数列表选择

......

条件或表达式:
    条件表达式
    条件或表达式 || 条件表达式

空合并表达式:
    条件或表达式
    条件或表达式??空合并表达式

条件表达式:
    空合并表达式
    空合并表达式?表达:表达

lambda 表达式:
    匿名函数签名 => 匿名函数体

由于在您的示例中以thenull-coalescing-expression结尾,因此将解析为. 通过将其包裹在括号中,它可以被解析为.conditional-or-expressionssimple-nameparenthesized-expression

于 2010-07-10T07:21:39.230 回答