考慮下面的類,調用構造函數重載時都超載具有相同簽名
class Foo
{
public Foo(int count)
{
/* .. */
}
public Foo(int count)
{
/* .. */
}
}
上面的代碼是無效的,將無法編譯。現在考慮下面的代碼,
class Foo<T>
{
public Foo(int count)
{
/* .. */
}
public Foo(T t)
{
/* .. */
}
}
static void Main(string[] args)
{
Foo<int> foo = new Foo<int>(1);
}
上面的代碼是有效的,編譯好。它調用Foo(int count)。
我的問題是,如果第一個無效,第二個如何有效?我知道類Foo <T>是有效的,因爲T和int是不同的類型。但是當它使用像Foo <int> foo = new Foo <int>(1),T得到整數類型和兩個構造函數將具有相同的簽名權?爲什麼編譯器不顯示錯誤而不是選擇一個重載執行?
猜測第二個Foo <>在2必須是int – Dykam 2009-08-18 16:42:36
「合法的C#程序可以翻譯成非法代碼」這怎麼可能?我認爲翻譯結果是一個'newobj'指令和一個方法標記,其中'Foo .ctor(int)'和'Foo .ctor(T)'具有不同的方法標記。所以在IL中沒有含糊之處。我錯過了什麼? –
2015-02-23 00:48:26
@BenVoigt:首先,如果我說「不可驗證的代碼」或「具有實現定義的行爲的代碼」,那麼代替「非法代碼」就會更準確。產生簽名碰撞的通用結構的後果是微妙的。假設我們有兩個具有相同簽名的方法,並希望在元數據中指出其中一個方法是實現特定的接口方法。沒有可以在方法實現表中使用相同簽名的兩種方法消除歧義的元數據結構。還有其他類似的奇怪情況。 – 2015-02-23 19:18:45