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