通用列表上的is-operator

0xD*_*EEF 7 .net c# generics inheritance list

interface IVehicle 
{
    void DoSth();
}

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

class Golf : VW { }

class Lupo : VW
{
    public override void DoSth()
    {
        base.DoSth();
        ...
    }  
}
Run Code Online (Sandbox Code Playgroud)

在我的代码我有:

List<VW> myCars = new List<VW>();
myCars.Add(new Golf());
myCars.Add(new Lupo());
Run Code Online (Sandbox Code Playgroud)

现在我想评估我是否有车辆清单.就像是:

if(myCars is List<IVehicle>)
{
    foreach(IVehicle v in myCars)
        v.DoSth();
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?通用列表中的is-operator不起作用.有另一种方式吗?

Mar*_*ell 11

即使使用4.0方差规则,即使VW是IVehicle,大众列表也不会是IVehicle列表.这不是方差的工作原理.

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

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

由于IEnumerable<out T>展品协方差.

  • 并且`if(myCars是IEnumerable <IVehicle>)`在.NET 4.0中也能正常工作. (4认同)
  • @Steven确实; 我只讨厌做两次测试; p (2认同)