interface IVehicle
{
    void DoSth();
}

class VW : IVehicle
{
    public virtual void DoSth() { ... }
}

class Golf : VW { }

class Lupo : VW
{
    public override void DoSth()
    {
        base.DoSth();
        ...
    }
}

在我的代码中,我有:
List<VW> myCars = new List<VW>();
myCars.Add(new Golf());
myCars.Add(new Lupo());

现在我想评估我是否有车辆 list 。就像是:
if(myCars is List<IVehicle>)
{
    foreach(IVehicle v in myCars)
        v.DoSth();
}

我怎样才能做到这一点?通用列表上的is-operator不起作用。还有另一种方法吗?

最佳答案

即使使用 4.0 差异规则,大众汽车列表也永远不是汽车汽车列表,即使大众汽车是汽车汽车。这不是方差的工作方式。

但是,在 4.0 中,您可以使用:

var vehicles = myCars as IEnumerable<IVehicle>;
if(vehicles != null) {
     foreach(var vehicle in vehicles) {...}
}

由于 IEnumerable<out T> 表现出协方差。

10-05 21:52