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