【发布时间】:2018-01-19 05:34:05
【问题描述】:
假设有一个抽象基类和一个或多个子类:
public abstract class BaseInnerClass
{
public int Id { get; set; }
}
public class ConcreteInnerClass : BaseInnerClass
{
public string Name { get; set; }
}
那么,假设有一个通用抽象类具有上述抽象类类型的属性:
public abstract class GeneriAbstractTestClass<T> where T : BaseInnerClass
{
public T InnerClass { get; set; }
}
那么让我们创建一个继承自上面类的类:
public class ConcreteTestClass : GeneriAbstractTestClass<ConcreteInnerClass>
{
public string ConcreteString { get; set; }
}
所以现在一切都准备好问一个问题了;)为什么不可能做到这一点:
//cannot convert initializer type
GeneriAbstractTestClass<BaseInnerClass> genericClass = new ConcreteTestClass();
虽然这是允许的:
//ok
BaseInnerClass baseInner = new ConcreteInnerClass();
这两个作业有什么区别?
【问题讨论】:
-
简单地说,
GeneriAbstractTestClass<BaseInnerClass>不是GeneriAbstractTestClass<ConcreteInnerClass>,反之亦然,就像List<Apple>不是List<Fruit>。请参阅stackoverflow.com/questions/7643211/… - 不确定这 相当 是否算作重复,但非常接近。 -
我想对你阅读会有帮助:real world example和covariance-contravariance
标签: c#