然而,下面的例子
1using System;
2
3delegate int delegate1( int x );
4delegate int delegate2( string s );
5
6class Program
7{
8 private static void sample(delegate1 method)
9 {
10 Console.WriteLine("void Sample(delegate1 method)");
11 }
12
13 private static void sample(delegate2 method)
14 {
15 Console.WriteLine("void Sample(delegate2 method)");
16 }
17
18 static void Main(string[] args)
19 {
20 sample((int x) => 0);
21 // sample((x) => 0); // 如果沒有參數類型聲明會產生錯誤
22 }
23}
24
List 15 必須指定參數類型的情況
這個例子中,“sample((x)=> 0”會產生編譯錯誤。滿足條件的sample方法有兩個,所有就不能確定究竟應該使用哪個。然而,在參數前加上類型聲明“sample((int x) => 0”,就能夠編譯執行。因為參數類型的指定,在2個sample方法中,有一個與之類型相吻合,所以以此為依據就能夠選擇了。
什麼都不做的Lambda表達式
這個話題說到此,還有盲點。這裡先說明一下什麼都不做的Lambda表達式的寫法。
Lambda表達式沒有返回值的情況(void的情況),想使其內容為空的情況下(調用後什麼也不執行的Lambda表達式選擇使用的情況),可以使用內容為空的Lambda語句。
例如,下面這個的Lambda表達式:
(x) => { };
這樣用Lambda表達式重構,解決了“引入了null值對象”的問題。一句話,不應該用null表示什麼也不做的表達式,而是采用調空Lambda表達式的手法。
簡單的說,分別用代碼來展示能夠使用和不能夠使用這個技術的場合。
首先,說說不能夠使用該技術的場合。下面的代碼,因為什麼也不需要處理,所以用null值表示的例子。Sample方法的參數action,僅在值不為null的情況下被調用。
using System;
class Program
{
private static void Sample(Action<string> action)
{
if (action != null) action("Hello!");
}
static void Main(string[] args)
{
Action<string> action = null;
Sample(action);
action = (x) => Console.WriteLine(x);
Sample(action); // 輸出:Hello!
}
}