List12 使用三元運算符(?:)的Lambda表達式
但是,前一章的List10的例子裡,其中的if語句中就不能改用三元運算符來替換。如果試圖替換的話就是以下情況:
using System;
class Program
{
static void Main(string[] args)
{
Action<string> method = (filename) =>
filename == null
? Console.WriteLine("Hello!")
: System.IO.File.WriteAllText(filename, "Hello!");
method(null);
method("hello.txt");
}
}
List13 List10中用三元運算符改寫後(產生編譯錯誤)
這個代碼,會產生以下的編譯錯誤:
error CS0201: 只有 assignment、call、increment、decrement 和 new 對象表達式可用作語句。
error CS0173: 無法確定條件表達式的類型,因為“void”和“void”之間沒有隱式轉換。
這並不是說Lambda表達式不能調用具有void返回值的方法。下面的代碼就沒有問題。
Action<string> method =
(filename) => System.IO.File.WriteAllText(filename, "Hello!");
這裡產生error的原因是,三元運算符的第二個、第三個運算數不能寫成void類型的表達式(因為這樣寫,void沒法隱式轉換成第二個、第三個運算數的類型,所以整個表達式的類型就無法判斷了。
因為存在這樣的問題,有void類型的返回值的表達式情況下,三元運算符使用就很困難。其實,void返回值的表達式很難理解,不能寫反而是個好事。