C#:'lambda expression'和'lambda expression'之间没有隐式转换?

时间:2009-02-19 11:50:13

标签: c# lambda

  

无法确定条件表达式的类型,因为'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");
    }

1 个答案:

答案 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#的类型推断不可能更强大,这是一种耻辱 - 但它已经非常复杂了。