Объединяющий пустой указатель оператор и лямбда-выражение

смотрите на следующий код, который я попытался написать в конструкторе:

private Predicate<string> _isValid;

//...

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

Код не компилирует - просто "термин недопустимого выражения" s и так один.

По контрасту это действительно компилирует, и я мог просто использовать его:

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

Однако я все еще задаюсь вопросом, почему этот синтаксис не позволяется.

Какие-либо идеи?

9
задан Matthias 10 July 2010 в 06:37
поделиться

2 ответа

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

Будет работать :)

Он проанализировал это следующим образом:

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

что не имеет никакого смысла.

11
ответ дан 4 December 2019 в 15:11
поделиться

Посмотрите на эту часть грамматики 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.

2
ответ дан 4 December 2019 в 15:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: