我最近写了这个,很惊讶它编译:
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<U,V>' 不能同时实现 'IMyInterface<U,V>' 和 'IMyInterface<V,U>' 因为它们可能会针对某些类型参数替换进行统一
为什么第一个允许写?