2012-01-17 47 views
18

我有一個關於null類型的查詢。
我有一個小程序,任何人都可以告訴我這個。C中的空字面的類型#

public class TestApplication 
{ 
    public void ShowText(object ob) 
    { 
     Console.Write("Inside object"); 
    } 
    public void ShowText(string str) 
    { 
     Console.Write("Inside string"); 
    } 
    public void ShowText(int i) 
    { 
     Console.Write("Inside int."); 
    } 
    public void ShowText(char c) 
    { 
     Console.Write("Inside Character"); 
    } 
    static void Main(string[] args) 
    { 
     new TestApplication().ShowText(null);    
     Console.Read(); 
    } 
} 

爲什麼它調用字符串函數。
是否意味着null的類型是字符串。
這看起來可能是一個愚蠢的結論,但我無法找到該區域爲什麼要調用字符串的函數。

回答

31

您對null文本類型的問題是在這裏找到答案:What is the type of null literal?

但是,在談論重載決議時,其實並不重要。實際的空值本身會自動轉換爲最終的類型。

至於爲什麼string超載被稱爲:

  1. 你不能傳遞null作爲intchar參數,它們是值類型,所以這兩個重載都出來了。 (他們本來是應聘人員,你讓他們可爲空int?char?類型,但我不會去成。)

  2. 服用引用類型的其他兩個重載之間,string是一個更具體的類型比object。也就是說,它來源於(因此可以隱式轉換爲)object。另外,從C#語言規範以下部分(重點煤礦):

    7.5.3.5更好的轉換目標

    給出了兩種不同類型T1T2T1T2更好的轉換目標如果下列中的至少一個成立:

    • 的隱式轉換從T1T2存在,並且從T2T1不存在隱式轉換

    • ...

因此,過載string被選擇作爲最合適的。

+0

你可以給我的任何地區,爲什麼它更具體。我無法理解。這是否意味着null的類型是字符串? – 2012-01-17 09:08:12

+0

@krshekhar:不,它有任何類型。強制對象做:'(object)null' – leppie 2012-01-17 09:10:01

+2

從鏈接的答案來看,從null類型的C#3.0被從規範中刪除,所以null基本上沒有類型。 – SWeko 2012-01-17 09:20:08

1

這是C#中重載解析的一個示例,它不能證明null的類型是字符串。

null是包含在任何引用類型的域中的特殊值,它基本上確定沒有有效的引用。因此,它可以是stringint?object等等。

您甚至可以將null投射到任何參考類型,以獲得「正確」鍵入null,例如,如果它作爲一個值在?操作

int? value = (i > 0) ? i : null; // does not compile 
int? value = (i > 0) ? i : (int?)null; //works 
4

null可以適合任何引用類型必須轉換爲null。因此是多態性的一個很好的例子。

可以說你有一個Vehicle類。您可以創建另外三個類別Two-WheelerThree-WheelerFour-Wheeler

if後3類extendsVehicle class;它被稱爲Vehicle被指定爲這三個類別。

所以,給定一個值,比如汽車,更具體地適合這個值是Four-Wheeler

null類似的情況。它可以適合於ObjectString;但更具體的匹配是String

讓我們來看看編譯器如何認爲(具體到你的代碼只),當它看到一個調用ShowText(null)方法

  1. 查找ShowText方法。
  2. 哦,我找到了4種方法,哪一種叫?!!
  3. 讓我們看看通過了什麼參數,嗯..它是null
  4. 查找ShowText以引用類型爲參數的方法。所有帶原始參數的重載都會被忽略。
  5. 哦不......我可以匹配它012it或object
  6. 哪個更具體。即從下面的繼承層次結構開始。
  7. 華友..發現它..它的string ..讓我們打電話吧。

而且,因爲如果你想要的是已瞭解如果編譯器發現在步驟6鐵道部以上的比賽會發生什麼......定義ShowText(字符串[]瓦爾斯),並看到自己的練習。