说我有这个方法
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。
