public interface IGeneric<T>{}
public class Student{}
public class Teacher{}
這是可能的
public class ConcreateClass : IGeneric<Student>, IGeneric<Teacher>{}
這是不可能的
public class GenericClass<T1, T2> : IGeneric<T1>, IGeneric<T2> {}
因爲GenericClass<String, String> instance;
會引起歧義的兩個接口的實現。但爲什麼這是不可能的
public class GenericClassWithTypeConstraints<T1, T2> : IGeneric<T1>, IGeneric<T2>
where T1 : Student
where T2 : Teacher
{}
由於T1和T2不能是同一類? (編譯器誤差是相同的情況下,而不類型約束)
編輯
「Soner格尼爾」在Why does this result in CS0695提出了workarround,使用類繼承的兩個級別,這樣的:
public interface IGeneric<T> { String Name { get; } }
public class Student{}
public class Teacher{}
public class GenericClassBase<T1> : IGeneric<T1>
where T1 : Student
{ String IGeneric<T1>.Name { get { return "Generic class of Student"; } } }
public class GenericClassDerived<T1, T2> : GenericClassBase<T1>, IGeneric<T2>
where T1 : Student
where T2 : Teacher
{ String IGeneric<T2>.Name { get { return "Generic class of Teacher"; } } }
這樣的代碼然後產生預期的結果
GenericClassDerived<Student, Teacher> X = new GenericClassDerived<Student, Teacher>();
Console.WriteLine(((IGeneric<Student>)X).Name); //outputs "Generic class of Student"
Console.WriteLine(((IGeneric<Teacher>)X).Name); //outputs "Generic class of Teacher"
參見:[?爲何C#編譯器抱怨「類型可以結合」,當它們從不同的基類派生](http://stackoverflow.com/questions/7664790/why-does-the -c-sharp-compiler-complain-that-types-may-unify-when-they-derive-f),它非常相似。 – Ani 2013-04-04 07:30:15
通過搜索CS0695找到[此問題](http://stackoverflow.com/questions/15316898/why-does-this-result-in-cs0695)。答案包括規範參考,包括:「在確定所有可能的構造類型時,不考慮約束聲明。」 – 2013-04-04 07:34:35
@Ani謝謝,現在我明白,這是不可能的定義的C#。這可能也是VB的情況。 – Karuzo 2013-04-04 08:19:29