C# 空合并运算符和lambda表达式

C# 空合并运算符和lambda表达式,c#,.net,lambda,null-coalescing-operator,C#,.net,Lambda,Null Coalescing Operator,请看我试图在构造函数中编写的以下代码: private Predicate<string> _isValid; //... Predicate<string> isValid = //...; this._isValid = isValid ?? s => true; 私有谓词是有效的; //... 谓词isValid=/。。。; 这个.\u isValid=isValid??s=>true; 代码没有编译-只是“无效表达式项”等等 相比之下,它可以编译,我

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

private Predicate<string> _isValid;

//...

Predicate<string> isValid = //...;
this._isValid = isValid ?? s => true;
私有谓词是有效的;
//...
谓词isValid=/。。。;
这个.\u isValid=isValid??s=>true;
代码没有编译-只是“无效表达式项”等等

相比之下,它可以编译,我可以直接使用它:

this._isValid = isValid ?? new Predicate<string>(s => true);
this.\u isValid=isValid??新谓词(s=>true);
但是,我仍然想知道为什么不允许使用这种语法

有什么想法吗

this._isValid = isValid ?? (s => true);
将起作用:)

它是这样解析的:

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

这没有任何意义。

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

括号表达式: (表达) ..... 简单名称: 标识符类型参数listopt ..... 条件或表达式: 条件与表达式 条件或表达式| |条件和表达式 空合并表达式: 条件或表达式 条件还是表达式??空合并表达式 条件表达式: 空合并表达式 空合并表达式?表达式:表达式 lambda表达式: 匿名函数签名=>匿名函数体 由于
null合并表达式
条件或表达式
终止,因此示例中的
s
将解析为
简单名称
。通过将其包装在括号中,可以将其解析为带括号的表达式

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