從上面的IL代碼我們可以看出對於 string s=null;這句代碼在IL中表示為:ldnull。
再根據上面的結論,我們看下面的 代碼:
using System;
猜猜上面的代碼執行結果會是怎樣的?
public class Program
{ public static void Main()
{
Show(null);
Show("");
Show(1);
}
static void Show(Object o)
{
Console.WriteLine("Object");
}
static void Show (String s)
{
Console.WriteLine("String");
}
}
以下是程序運行結果:
String
Object
Object
從上面的運行結果我們可以 得出以下結論:
(1)從Show(null)最後調用的是static void Show(String s)方法我 們更進一步可以說在C#中是方法調用盡量精確匹配的。盡管null我們可以理解為一個空 object對象或者一個空字符串,但是在這裡C#還是精確為派生類。這就像我們沒有錢,可以 說沒有一分錢也可以說沒有500英鎊,但是沒有一分錢自然就沒有500億英鎊,所以我們跟別 人說沒有錢的時候沒有必要說沒有500億英鎊一樣。在這裡自然null就表示空字符串。所以 Show(null)這個方法會調用static void Show(String s)這個方法。
這有點像下面的 情況:
一次活動大會上,主持人說:“身高不到1.60m的請坐在1到3排,身高不 到1.75m的請做到4到6排,其他的請隨便坐。”
上面的語句似乎有些邏輯方面的 問題,應該說身高超過1.60m但是不到1.75m的請坐到4到6排。但是如果你面對著一群拿著槍 的強盜,他說上面的話時,恰好你也在場並且你的身高是1.55m,你會坐到哪一排?你總不可 能冒著挨一槍的危險去糾正他的邏輯錯誤吧?最好的辦法是坐到1到3排。因為無論怎麼說你 的身高是絕對滿足不到1.60m這個條件的(盡管你的身高也滿足強盜說的第二個條件,即身高 不到1.75米,但是你肯定不會冒這個危險,從上下句的意思我們也能推斷出人家的意思就是 身高在1.61m到1.74m之間的人坐4到6排)。
在上面的代碼中,你在運行環境的眼中就 是一個持槍的強盜,雖然null可以理解為null類型的string或者null類型的object,但是它 不能向你問清楚這個到底是null類型的string或者null類型的object,因為string是Object 的派生類,所以它按照null類型的string來調用相應的方法了。
(2)從Show ("")最後調用static void Show(String s)這個方法進一步證明了方法調用是盡 量選擇參數最匹配的那個執行。因為Show("")相當於:string s = ""; Show(s);s的引用類型是string,所以會調用static void Show(String s)這 個方法。