Подтвердить что ты не робот

Как назначить Func <> условно между лямбдами, используя условный тернарный оператор?

Как правило, при использовании условного оператора здесь синтаксис:

int x = 6;
int y = x == 6 ? 5 : 9;

Ничего необычного, довольно прямолинейного.

Теперь попробуйте использовать это при назначении Lambda для типа Func. Позвольте мне объяснить:

Func<Order, bool> predicate = id == null
    ? p => p.EmployeeID == null
    : p => p.EmployeeID == id;

Тот же синтаксис, и должен работать? Правильно? По какой-то причине это не так. Компилятор дает это приятное загадочное сообщение:

Ошибка 1 Тип условного выражения не может быть определен, потому что не существует неявного преобразования между "лямбда-выражением" и "лямбда-выражением"

Затем я пошел дальше и изменил синтаксис, и таким образом он работал:

Func<Order, bool> predicate = id == null
    ? predicate = p => p.EmployeeID == null
    : predicate = p => p.EmployeeID == id;

Мне просто интересно, почему это не работает первым способом?

(Боковое замечание: мне не нужен этот код, так как я выяснил, что при сравнении значения int против null вы просто используете object.Equals)

4b9b3361

Ответ 1

Вы можете преобразовать лямбда-выражение в конкретный тип делегируемого адресата, но для определения типа условного выражения компилятор должен знать тип каждого из второго и третьего операндов. Хотя они оба просто "лямбда-выражения", нет никакого преобразования от одного к другому, поэтому компилятор не может ничего использовать.

Я бы не предложил использовать назначение, однако - бросок более очевиден:

Func<Order, bool> predicate = id == null 
    ? (Func<Order, bool>) (p => p.EmployeeID == null)
    : p => p.EmployeeID == id;

Обратите внимание, что вам нужно предоставить его только для одного операнда, поэтому компилятор может выполнить преобразование из другого выражения лямбда.

Ответ 2

Компилятор С# не может вывести тип созданного лямбда-выражения, потому что он сначала обрабатывает тройной, а затем назначение. вы также можете сделать:

Func<Order, bool> predicate = 
    id == null ? 
        new Func<Order,bool>(p => p.EmployeeID == null) :
        new Func<Order,bool>(p => p.EmployeeID == id);

но это просто отстой, вы также можете попробовать

Func<Order, bool> predicate = 
    id == null ? 
        (Order p) => p.EmployeeID == null :
        (Order p) => p.EmployeeID == id;