【发布时间】:2012-12-05 08:26:02
【问题描述】:
我最近写了这个,很惊讶它可以编译:
public class MyGeneric<U, V> {
MyGeneric(U u) { ... }
MyGeneric(V v) { ... }
public void Add(U u, V v) { ... }
public void Add(V v, U u) { ... }
}
如果我如下使用这个类,如果我调用 Add,我会得到一个“不明确的构造函数引用”和一个“不明确的调用”。
var myVar = new MyGeneric<int, int>(new MyIntComparer());
显然,当我使用 int 和 double 作为泛型类型时没有歧义,当然,当我同时使用这两个 int 时,它们也会分配给 double。
var myVar = new MyGeneric<int, double>(new MyIntComparer());
myVar.Add(3, 5);
然后我认为以下也是允许的,但令人惊讶的是我得到了一个错误。为什么下面的不能编译?
public interface IMyInterface<T, S> {
void Add(T t, S s);
}
public class MyGeneric<U, V> : IMyInterface<U, V>, IMyInterface<V, U> {
public MyGeneric(U u) { }
public MyGeneric(V v) { }
void IMyInterface<U, V>.Add(U u, V v) { ... }
void IMyInterface<V, U>.Add(V v, U u) { ... }
}
无论我使用隐式还是显式接口实现,编译器都会声明
'MyGeneric' 不能同时实现 'IMyInterface' 和 'IMyInterface
' 因为它们可能会统一用于某些类型参数替换
为什么第一个允许写?
【问题讨论】:
-
感谢这些链接,这是我正在寻找的编译器的实现解释
-
@Rawling,感谢您提供有趣的链接。