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

В С#, почему нет?: Оператор работает с лямбдами или группами методов?

Не работает:

Func<string, byte[]> getFileContents = (Mode != null && Mode.ToUpper() == "TEXT")
            ? TextFileContents
            : BinaryFileContents;

private static byte[] BinaryFileContents(string file)
{
    return System.IO.File.ReadAllBytes(file);
}

private static byte[] TextFileContents(string file)
{
    using (var sourceStream = new StreamReader(file))
    {
        return Encoding.UTF8.GetBytes(sourceStream.ReadToEnd());
    }
}

Ошибка

нет неявного преобразования между группой методов и группой методов

Работает:

Func<string, byte[]> getFileContents2;
if (Mode != null && Mode.ToUpper() == "TEXT")
{
   getFileContents2 = TextFileContents;
}
else
{
   getFileContents2 = BinaryFileContents;
}

Мне просто интересно, почему? Я что-то пропустил?

4b9b3361

Ответ 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 имеет тип [...]
  • В противном случае тип выражения не может быть определен, и возникает ошибка времени компиляции.