考虑下面的类,调用构造函数重载时都超载具有相同签名
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