我最近写了下面的代码,出乎意料地它竟然能够通过编译:
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’,因为它们可能在某些类型参数替代中统一”。而为什么第一个写法是被允许的呢?