2012-01-04 26 views
11

假設我有這兩個重載函數。方法重載。它是如何工作的?

public static void Main(string[]args) 
{ 
    int x=3; 
    fn(x); 
} 

static void fn(double x) 
{ 
    Console.WriteLine("Double"); 
} 

static void fn(float x) 
{ 
    Console.WriteLine("Float"); 
} 

爲什麼編譯器會選擇float函數?

回答

22

它遵循C#4規範第7.5.3.2節的規則。

int隱式轉換爲兩個floatdouble,所以這兩種候選方法爲適用

鑑於兩種不同類型的T1和T2,T1是一個更好的轉換目標:然而,從intfloat轉換根據部分7.5.3.2-7.5.3.5是從intdouble轉換「優於」比T2如果以下中的至少一個成立:

  • 從T1到T2的隱式轉換存在,並且從T2到T1的隱式轉換存在
  • ... [不相干在這種情況下]

在這裏,有一個從floatdouble的隱式轉換,但是從doublefloat的隱式轉換 - 所以floatdouble更好的轉換目標。

+0

更好的意思是什麼?尺寸更接近? – 2012-01-04 22:45:58

+1

@sleimanjneidi:更好的意思是「根據規範更好」 - 這只是一個術語。在某種意義上,它的確具有「更具體」的含義......但是真的,您應該根據規範規則IMO來考慮它。 – 2012-01-04 22:49:51

+1

@JonSkeet:你的回答中最後一句問題很簡單:爲什麼從「float」轉換爲「double」相關?編譯器是否不必決定從_int到float_的轉換還是從_int到double_的轉換更好? – afrischke 2012-01-04 23:18:27

11

Jon的答案當然是對的。添加更多細節:這裏的設計原則是「更具體」的方法更好。如果您有:

void M(object x){} 
void M(Animal x){} 
void M(Giraffe x){} 

,你叫M(new Giraffe())很明顯,你會想精確匹配。如果你叫M(new Tiger()),最好的搭配是「動物」,因爲老虎是一種動物,老虎是一種物體,但動物是比物體更具體。我們如何知道動物比物體更具體?因爲每個動物都是一個物體,但並不是每一個物體都是動物,所以動物必須更具體。

如果您撥打M(null),我們會選擇長頸鹿版本。長頸鹿比動物更具體,因爲每隻長頸鹿都是動物,但不是每隻動物都是長頸鹿。

在你的例子中,float比double更好,因爲它更具體。每個浮動都可以轉換爲double,但不是每個double都可以轉換爲浮動,所以float更具體。就像每個動物都可以轉化爲物體一樣,但並不是每個物體都可以轉化爲動物,所以動物更具體。

+0

M(null)是不是一個模糊的調用? – 2012-01-04 23:20:44

+1

@sleimanjneidi:不,我只是說了爲什麼它不含糊。有三種適用的方法。最具體的一個勝利。如果說方法是M(字符串),M(長頸鹿)和M(int?),那麼M(空)會是不明確的,因爲字符串,長頸鹿和int?沒有多少具體的特點。 – 2012-01-04 23:29:38

相關問題