Как я могу присвоить Func <> условно между лямбдами с помощью условного тернарного оператора?

Как будто вы пытаетесь получить доступ к объекту, который является null. Рассмотрим ниже пример:

TypeA objA;

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

См. Также этот пример:

String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
47
задан Erik Philips 3 April 2017 в 12:48
поделиться

2 ответа

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

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

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

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

45
ответ дан Jon Skeet 26 November 2019 в 19:53
поделиться

Компилятор 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;
6
ответ дан Jake 26 November 2019 в 19:53
поделиться
Другие вопросы по тегам:

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