我們認爲有一個抽象基類和一個或多個子類:多態性而iheriting泛型類
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'不是'GeneriAbstractTestClass '或反之亦然,就像一個'列表'不是'列表'。請參閱https://stackoverflow.com/questions/7643211/how-to-pass-listderivedclass-when-param-type-is-listbaseclass/7643257#7643257 - 不確定這*相當*是否重複,但它是非常關。 –
我認爲它會幫助你閱讀它:[真實世界的例子](https://stackoverflow.com/questions/2662369/covariance)和[協方差 - 反變化](https://docs.microsoft.com/zh-cn/ -us/dotnet/csharp/programming-guide/concepts/covariance-contravariance /) –