Domanda

Dai un'occhiata al seguente codice che ho tentato di scrivere all'interno di un costruttore:

private Predicate<string> _isValid;

//...

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

Il codice non si compila - solo "termine di espressione non valida" S e così uno.

al contrario che si compila e potrei semplicemente usarlo:

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

Tuttavia, mi chiedo ancora perché questa sintassi non sia consentita.

Qualche idea?

È stato utile?

Soluzione

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

funzionerà :)

Si è analizzato in questo modo:

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

che non ha senso.

Altri suggerimenti

Controlla questa parte della grammatica 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
.

Dal momento che null-coalescing-expression termina con conditional-or-expression Il s nell'esempio analizzerà come simple-name.Avvolgendolo tra parentesi può quindi essere analizzato come parenthesized-expression.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top