[英]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.