Подтвердить что ты не робот

С#: нет неявного преобразования между "лямбда-выражением" и "лямбда-выражением"?

Тип условного выражения не может быть определен, потому что не существует неявного преобразования между "лямбда-выражением" и "лямбда-выражением"

Скажи, что? Может ли кто-нибудь объяснить мне эту ошибку компиляции? Это код, который его производит:

    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");
    }
4b9b3361

Ответ 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);
}

Я предполагаю, что ваш реальный код более сложный, хотя.

Как-то стыдно, что вывод типа С# не может быть более мощным, но это уже довольно сложно.