Как будто вы пытаетесь получить доступ к объекту, который является null
. Рассмотрим ниже пример:
TypeA objA;
. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException
, что имеет смысл.
См. Также этот пример:
String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
Можно преобразовать лямбда-выражение в конкретный целевой тип делегата, но для определения типа условного выражения, компилятор должен знать тип каждого из вторых и третьих операндов. В то время как они - оба просто "лямбда-выражение" нет никакого преобразования от одного до другого, таким образом, компилятор не может сделать ничего полезного.
я не предложил бы использовать присвоение, однако - бросок более очевиден:
Func<Order, bool> predicate = id == null
? (Func<Order, bool>) (p => p.EmployeeID == null)
: p => p.EmployeeID == id;
Примечание, что только необходимо обеспечить его для одного операнда, таким образом, компилятор может выполнить преобразование из другого лямбда-выражения.
Компилятор C# не может вывести тип созданного лямбда-выражения, потому что это обрабатывает троичное первое и затем присвоение. Вы могли также сделать:
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;