2013-09-25 67 views
4

鑑於以下重載方法:重載方法選擇邏輯

public string Test(long item) 
{ 
    return "Test with a long was called!"; 
} 

public string Test(int item) 
{ 
    return "Test with an int was called!"; 
} 

public string Test(object item) 
{ 
    return "Test with an object was called!"; 
} 

當我打電話Test(),傳遞short,像這樣:

short shortValue = 7; 
var result = Test(shortValue); 

爲什麼值result等於"Test with an int was called!",而不是"Test with an object was called!"

回答

7

爲什麼值結果等於「用int測試被調用!」,而不是「用一個對象測試被調用!」?

int的轉換比轉換爲object「更好」,所以超載服用int是一個比服用object「更好」 - 兩者都適用的short隱式轉換爲兩個intobject。 (過載服用long也適用,但轉換到int比一個更好的long也。)一般超載規則的C#語言規範的

參見7.5.3節和7.5.3.3爲關於「更好的轉換」的規則。將它們寫在這裏是沒有意義的,因爲它們非常長 - 但最重要的方面是有從intobject的轉換,但沒有從objectint的轉換 - 因此轉換爲int更具體,因此更好。

(Section數字是從C#4和C#5版本,您可以下載以Word格式C# 5 spec

+0

+1 - 啊,認爲它寧願繼承轉換。很高興知道,感謝C#規範的鏈接。 –

2

C#的規範規則意味着編譯器傾向於轉換shortint,而不是object。我認爲,這是由於以下規則從7.5.3.5 Better conversion target(鏈接到C#5規範的下載,或見equivalent from C# 1.2在線)

考慮兩種不同類型的T1和T2,T1是更好的轉換目標比T2如果至少下列之一成立:

  • 從T1到T2的隱式轉換存在,並且從T2到T1的隱式轉換存在
  • T1是有符號整數類型和T2是一個無符號的整數類型。 [其他的內容省略]

重寫它對於這種情況下,由於從intobject存在的隱式轉換,並且沒有隱式轉換從objectint存在,轉換爲int是更好的轉換。