Нуль-сливающийся оператор и лямбда-выражение - PullRequest
8 голосов
/ 10 июля 2010

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

private Predicate<string> _isValid;

//...

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

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

В отличие от этого, он компилируется, и я мог бы просто использовать его:

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

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

Есть идеи?

Ответы [ 2 ]

11 голосов
/ 10 июля 2010
this._isValid = isValid ?? (s => true);

будет работать :) 1002 *

Разобрал это так:

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

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

2 голосов
/ 10 июля 2010

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

...