Ответ 1
Тип условного выражения должен быть выведен как целое - и лямбда-выражения всегда должны быть преобразованы в конкретный тип делегата или дерева выражений.
В последних двух примерах компилятор знает, к чему он пытается преобразовать лямбда-выражение. В первом примере он сначала пытается выработать тип всего условного выражения.
Листинг в одной из ветвей будет достаточно, если:
protected override Func<Stream> GetStream()
{
return someBool
? (Func<Stream>)
(() => EmbeddedResourceExtractor.GetFile("SomeFile1.ext"))
: () => EmbeddedResourceExtractor.GetFile("SomeFile2.ext");
}
Sergio fix (теперь удаленный, но включенный ниже) будет работать, если вы были счастливы оценить someBool
во время вызова функции:
protected override Func<Stream> GetStream()
{
return () => someBool
? EmbeddedResourceExtractor.GetFile("SomeFile1.ext")
: EmbeddedResourceExtractor.GetFile("SomeFile2.ext");
}
В зависимости от времени есть всевозможные способы исправления приведенного вами примера, например.
protected override Func<Stream> GetStream()
{
string name = someBool ? "SomeFile1.ext" : "SomeFile2.ext";
return () => EmbeddedResourceExtractor.GetFile(name);
}
Я предполагаю, что ваш реальный код более сложный, хотя.
Как-то стыдно, что вывод типа С# не может быть более мощным, но это уже довольно сложно.