2010-07-10 12 views
7

jeter un oeil sur le code suivant je tentais d'écrire dans un constructeur:opérateur Null-coalescent et d'expression lambda

private Predicate<string> _isValid; 

//... 

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

Le code ne compile pas - seulement s et donc un « terme d'expression non valide ».

En revanche qui ne compilons et je pouvais l'utiliser:

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

Cependant, je me demande encore pourquoi cette syntaxe est pas autorisée.

Des idées?

Répondre

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

Est-ce que travailler :)

parsé Il ainsi:

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

qui ne fait pas de sens.

+0

Oui, c'est le cas. Merci! Je n'ai pas pensé aux priorités. – Matthias

1

Vérifiez cette partie de la grammaire 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 

Depuis null-coalescing-expression se termine par conditional-or-expression le s dans votre exemple analysera comme simple-name. En l'enveloppant entre parenthèses, il peut être analysé comme parenthesized-expression.