在C#中,为什么不';t?:运算符与lambda或方法组一起工作

本文关键字:lambda 运算符 方法 工作 一起 为什么不 | 更新日期: 2023-09-27 17:59:54

不工作:

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;
}

我只是好奇为什么?我是不是错过了什么?

在C#中,为什么不';t?:运算符与lambda或方法组一起工作

匿名函数和方法组本身没有类型-它们只是可以将转换为委托类型(以及某些lambda表达式的表达式树类型)。

对于确定表达式整体类型的条件运算符,第二个或第三个操作数中至少有一个必须具有类型。您可以将其中一个强制转换为Func<string, byte[]>,编译器会发现它可以将另一个转换为相同的类型,并且会很高兴。

例如:

Func<string, byte[]> getFileContents = DateTime.Now.Hour > 10
    ? (Func<string, byte[]>) TextFileContents
    : BinaryFileContents;

来自C#5规范的7.14节:

?的第二个和第三个操作数x和y:运算符控制条件表达式的类型。

  • 如果x具有类型x,y具有类型y,则[…]
  • 如果x和y中只有一个具有类型[…]
  • 否则,无法确定任何表达式类型,并且会发生编译时错误