Operatore null-coalescente e espressione lambda
-
13-09-2020 - |
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?
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