2010-07-10 63 views
7

看看下面的代码我试图在构造函数中写:空,合并运算和lambda表达式

private Predicate<string> _isValid; 

//... 

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

的代码不编译 - 只是“无效的表达术语” S和SO之一。

相反,它编译,我可以只使用它:

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

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

任何想法?

回答

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

将工作:)

据分析是这样:

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

不作任何意义。

+0

是的 - 确实如此。谢谢!我没有考虑优先事项。 – Matthias 2010-07-10 06:46:47

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终止与你的榜样将解析为simple-nameconditional-or-expressions。通过将其包装在圆括号中,可以将其解析为parenthesized-expression