首页 > 解决方案 > 具有类继承和泛型类型继承的 C# 集合不允许添加继承的类

问题描述

我遇到了一些可能的事情,但不起作用。

这是示例类,

abstract class BaseModel { }

abstract class BaseViewModel<T> where T : BaseModel
{
    protected T model;
}

class ModelA : BaseModel { }

class ViewModelA : BaseViewModel<ModelA> { }

现在我试着做

class Program
{
    static void Main(string[] args)
    {
        var collection = new List<BaseViewModel<BaseModel>>();
        collection.Add(new ViewModelA());
    }
}

直觉上,它看起来是工作。但是无法添加ViewModelA.

我想知道为什么这是不可能的,并解决这种情况。

标签: c#genericsinheritance

解决方案


ViewModelA不等于,BaseViewModel<BaseModel>即使您可能认为它是

这是因为类是不变的。

  • 不变性:意味着您只能使用最初指定的类型

  • Covariance:使您能够使用比最初指定的更多派生类型。

实现您想要的(可能)的一种方法是通过out generic modifier使用协变接口参数。但是,它有一定的局限性。类型参数只能作为接口方法的返回类型,不能作为方法参数的类型

例子

public interface IBaseViewModel<out T>  where T : BaseModel 
{ 
   ... 
}

abstract class BaseViewModel<T> : IBaseViewModel<T> where T : BaseModel 
{
   protected T model; 
}

class ModelA : BaseModel { }

class ViewModelA : BaseViewModel<ModelA> { }

static void Main(string[] args)
{
   var collection = new List<IBaseViewModel<BaseModel>>();
   collection.Add(new ViewModelA()); // this now works
}

推荐阅读