簡體   English   中英

在C#中,為什么不?:運算符使用lambda或方法組?

[英]In C#, why doesn't ?: operator work with lambda or method groups?

不起作用:

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

我只是好奇為什么? 我錯過了什么嗎?

匿名函數和方法組本身沒有類型 - 它們只能轉換委托類型(以及某些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中只有一個有類型[...]
  • 否則,無法確定表達式類型,並發生編譯時錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM