无法确定条件表达式的类型,因为'lambda expression'和'lambda expression'之间没有隐式转换
说说什么?有人可以向我解释这个编译错误吗?这是产生它的代码:
protected override Func<System.IO.Stream> GetStream()
{
return someBool
? () => EmbeddedResourceExtractor.GetFile("SomeFile1.ext")
: () => EmbeddedResourceExtractor.GetFile("SomeFile2.ext");
}
这不是:
protected override Func<System.IO.Stream> GetStream()
{
return () => EmbeddedResourceExtractor.GetFile("SomeFile1.ext");
}
这两个都没有:
protected override Func<System.IO.Stream> GetStream()
{
if(someBool)
return () => EmbeddedResourceExtractor.GetFile("SomeFile1.ext");
return () => EmbeddedResourceExtractor.GetFile("SomeFile2.ext");
}
答案 0 :(得分:46)
条件表达式的类型必须作为一个整体推断 - 并且lambda表达式总是必须转换为特定的委托或表达式树类型。
在后两个例子中,编译器知道它正在尝试将lambda表达式转换为什么。在第一个示例中,它首先尝试计算出整个条件表达式的类型。
其中一个分支中的演员阵容就足够了:
protected override Func<Stream> GetStream()
{
return someBool
? (Func<Stream>)
(() => EmbeddedResourceExtractor.GetFile("SomeFile1.ext"))
: () => EmbeddedResourceExtractor.GetFile("SomeFile2.ext");
}
Sergio的修复(现已删除,但包含在下方)将起作用如果您很乐意在调用该函数时评估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);
}
我猜你的真实代码更复杂。
在某种程度上,C#的类型推断不可能更强大,这是一种耻辱 - 但它已经非常复杂了。