Ответ 1
Анонимные функции и группы методов не имеют типов сами по себе - они просто конвертируются в типы делегирования (и типы дерева выражений для некоторых лямбда-выражений).
Чтобы условный оператор определял общий тип выражения, по крайней мере один из второго или третьего операндов должен иметь тип. Вы можете применить любой из них к Func<string, byte[]>
, и компилятор обнаружит, что он может преобразовать другой в тот же тип и быть счастливым.
Например:
Func<string, byte[]> getFileContents = DateTime.Now.Hour > 10
? (Func<string, byte[]>) TextFileContents
: BinaryFileContents;
Из раздела 7.14 спецификации С# 5:
Второй и третий операнды x и y оператора?: управляют типом условного выражения.
- Если x имеет тип X, а y имеет тип Y, тогда [...]
- Если только один из x и y имеет тип [...]
- В противном случае тип выражения не может быть определен, и возникает ошибка времени компиляции.