Как назначить 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)
Ответы
Ответ 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;