泛型列表中的 is 运算符

本文关键字:is 运算符 列表 泛型 | 更新日期: 2023-09-27 18:25:18

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());

现在我想评估我是否有车辆列表。 像这样:

if(myCars is List<IVehicle>)
{
    foreach(IVehicle v in myCars)
        v.DoSth();
}

我该怎么做? 泛型列表中的 is 运算符不起作用。还有其他方法吗?

泛型列表中的 is 运算符

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

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

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

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

在 .net 4 中,可以使用泛型参数方差。在此处阅读更多相关信息

你可以

这样做:

if (typeof(IVehicle).IsAssignableFrom(myCars.GetType().GetGenericArguments[0]))
    foreach (IVehicle v in myCars)
        //...

这假设您知道 myCars 是一种泛型类型。 如果您不确定,则需要先进行一两次额外的检查。

但是,由于您没有使用除 GetEnumerator 之外的任何列表成员,因此您可以执行以下操作:

if (myCars is IEnumerable<IVehicle>) //...