смотрите на следующий код, который я попытался написать в конструкторе:
private Predicate<string> _isValid;
//...
Predicate<string> isValid = //...;
this._isValid = isValid ?? s => true;
Код не компилирует - просто "термин недопустимого выражения" s и так один.
По контрасту это действительно компилирует, и я мог просто использовать его:
this._isValid = isValid ?? new Predicate<string>(s => true);
Однако я все еще задаюсь вопросом, почему этот синтаксис не позволяется.
Какие-либо идеи?
this._isValid = isValid ?? (s => true);
Будет работать :)
Он проанализировал это следующим образом:
this._isValid = (isValid ?? s) => true;
что не имеет никакого смысла.
Посмотрите на эту часть грамматики 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
Поскольку null-coalescing-expression
завершается conditional-or-expression
, s
в вашем примере будет разобран как simple-name
. Обернув его в круглые скобки, его можно разобрать как parenthesized-expression
.