2010-07-10 9 views
7

echar un vistazo al siguiente código he tratado de escribir dentro de un constructor:Null-coalescencia

private Predicate<string> _isValid; 

//... 

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

El código no compila - sólo "no válido plazo expresión" s y por lo que uno.

En contraste que se compila y yo sólo podía usarlo:

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

Sin embargo, todavía se preguntan por qué no se permite esta sintaxis.

¿Alguna idea?

Respuesta

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

Trabajará :)

Se Analizada esta manera:

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

que no tiene ningún sentido.

+0

Sí, lo hace. ¡Gracias! No pensé en las prioridades. – Matthias

1

Salida esta parte de la gramática de 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 

Desde null-coalescing-expressionconditional-or-expression termina con la s en su ejemplo analizará como simple-name. Al envolverlo entre paréntesis, se puede analizar como parenthesized-expression.