Skip to main content
 首页 » 编程设计

c#之如何将对象集合传递到采用基础对象集合的方法中

2024年01月22日28JustinYoung

说我有这个方法

 public void test(IList<AvaliableFeaturesVm> vm) 
        { 
 
        } 


我有一个继承我基础类的类

public class TravelFeaturesVm : AvaliableFeaturesVm 
    { 
 
    } 


我如何将其传递给方法“测试”。如果测试仅接受一个AvaliableFeatureVm对象,它将允许我传递TravelFeaturesVm对象,但是由于它们位于集合中,因此不允许我通过。

请您参考如下方法:

从C#4开始,如果将第一次调用的签名更改为:

public void test(IEnumerable<AvaliableFeaturesVm> vm) 
{ 
} 


这是由于C#4中引入的 generic covariance引起的。 IEnumerable<T>在C#4中的 T中是协变的,但是 IList<T>是不变的,因此它不会保持原样。如果您不使用C#4,则此方法将无法正常工作。

这是假设您的方法需要做的就是遍历集合。如果需要修改集合,则无论如何都不能传递子类型的列表-因为该方法可能会尝试添加基类的实例或其他子类型的实例。

另一种选择是使方法本身通用:

public void test<T>(IList<T> vm) where T : AvaliableFeaturesVm 


当然,这有其自身的局限性-特别是,您将再次无法编写:

vm.Add(new AvailableFeaturesVm()); 


...虽然您可以做到:

AvailableFeaturesVm first = vm[0]; 


因为约束条件确保了从 T到 AvailableFeaturesVm的适当转换。

有关一般差异的更多信息,请参见 Eric Lippert's blog posts。