【发布时间】:2013-04-04 07:22:11
【问题描述】:
拥有
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 不能属于同一类? (编译器错误和没有类型约束的情况一样)
编辑
Why does this result in CS0695 中的“Soner Gönül”提出了一个解决方法,使用两个级别的类继承,如下所示:
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"
【问题讨论】:
-
通过在 CS0695 上搜索找到 this question。答案包括规范参考,包括:“在确定所有可能的构造类型时,不考虑约束声明。”
-
@Ani 谢谢,现在我明白这在 C# 的定义中是不可能的。 VB 可能也是这种情况。
-
@Damien_The_Unbeliever谢谢。在您的链接中,我发现了 Soner Gönül 的贡献,这是一种解决方法,我会将其放在我的原始答案中。
标签: c# generics interface constraints