tutorial metodo expresiones c# .net lambda null-coalescing-operator

metodo - linq lambda c#



Operador de fusión nula y expresión lambda (2)

Eche un vistazo al siguiente código que intenté escribir dentro de un constructor:

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

El código no se compila, solo "términos de expresiones inválidas" y uno.

Por el contrario, compila y yo podría usarlo:

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

Sin embargo, todavía me pregunto por qué esta sintaxis no está permitida.

¿Algunas ideas?


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

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


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

Trabajará :)

Lo analizó de esta manera:

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

que no tiene ningún sentido.