我最近寫了這一點,並感到驚訝的是它編譯:泛型在C#中有多個泛型類型導致允許和不允許含糊
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) { ... }
}
如果我使用這個類,如下所示,我得到一個「不明確的構造函數引用」和一個「不明確的調用」,如果我打電話添加。
var myVar = new MyGeneric<int, int>(new MyIntComparer());
顯然,沒有歧義,當我用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 >',因爲它們可能統一某些類型參數替換
爲什麼第一個分配結婚寫?
雖然[這些](http://blogs.msdn.com/b/ericlippert/archive/2006/04/05/odious-ambiguous-overloads-part-one.aspx)[two](http:// blogs.msdn.com/b/ericlippert/archive/2006/04/06/odious-ambiguous-overloads-part-two.aspx)博客文章正在談論一種通用方法和非通用方法最終可能會出現的情況對某些類型參數使用相同的簽名,它們也可能適用於您的雙類型參數的情況。 (關於爲什麼允許這樣做的答案基本上是「我們允許它在C#2.0中,現在要更改它爲時已晚」)。 – Rawling
感謝這些鏈接,它是編譯器的實現說明,我正在尋找 – AlexH
@Rawling,感謝有趣的鏈接。 – Andreas