take a look at the following code I attempted to write inside a constructor:
private Predicate<string> _isValid;
//...
Predicate<string> isValid = //...;
this._isValid = isValid ?? s => true;
The code doesn't compile - just "invalid expression term"s and so one.
In contrast that does compile and I could just use it:
this._isValid = isValid ?? new Predicate<string>(s => true);
However, I still wonder why this syntax is not allowed.
Any ideas?
this._isValid = isValid ?? (s => true);
Will work :)
It parsed it this way:
this._isValid = (isValid ?? s) => true;
which does not make any sense.
Check out this portion of the C# grammar:
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
Since null-coalescing-expression
terminates with conditional-or-expression
the s
in your example will parse as a simple-name
. By wrapping it in parentheses it can then be parsed as a parenthesized-expression
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With