Ответ 1
Проблема заключается в том, что demo1
не является простым выражением, это метод. И методы могут быть переопределены, поэтому на самом деле это не один метод, это группа методов. Рассмотрим следующий пример:
public class Demo {
protected bool branch;
protected void demo1 (int) {}
protected void demo1 () {}
protected void demo2 () {}
public Action DoesntWork() {
return branch ? demo1 : demo2; //Error
return demo1; //ok
}
}
Теперь demo1
перегружен, поэтому какую из двух версий следует использовать? Ответ заключается в том, что перегруженная функция выбирается с использованием контекста, в котором используется функция.
В return demo1
очевидно, что он ожидает Action
.
Но в return branch? demo1 : demo2;
контекст не так прост. Тернарный оператор сначала пытается сопоставить тип demo1
с типом demo2
, но это еще одна группа методов, поэтому там никакой помощи нет. Компилятор не смотрит дальше и не работает.
Решение состоит в том, чтобы очистить тип, ожидаемый от группы методов:
return branch? new Action(demo1) : demo2;
return branch? (Action)demo1 : demo2;
Action d1 = demo1;
return branch? d1 : demo2;