7

我正在学习实现接口和泛型,我编写了这段代码,但是 VStudio 说我没有实现 System.Collections.Enumerable.GetEnumerator()。我一般没有在下面这样做吗?它想要两个实现?

namespace Generic_cars
{
 class VehicleLot:IEnumerable<Vehicle>
 {
    public List<Vehicle> Lot = new List<Vehicle>();

    IEnumerator<Vehicle> IEnumerable<Vehicle>.GetEnumerator()
    {
        foreach (Vehicle v in Lot) { yield return v; };
    }
 }
}
4

3 回答 3

7

您正在实现IEnumerable<Vehicle>一个通用接口,它是强类型的以保存Vehicle对象。然而,该接口派生自IEnumerable非通用的旧接口,并且被键入以保存object对象。

如果您想实现通用版本(您这样做),您还需要实现非通用版本。通常,您只需调用泛型版本即可实现非GetEnumerator泛型。

此外,您可能不想明确地实现GetEnumerator<Vehicle>您的方式;这将需要您明确地将对象转换IEnumerable<Vehicle>为才能使用它们。相反,您可能想要这样做:

public IEnumerator<Vehicle> GetEnumerator() {
    foreach( Vehicle item in items ) {
        yield return item;
    }
}

IEnumerator IEnumerable.GetEnumerator() {
    return GetEnumerator();
}
于 2012-10-15T02:35:09.943 回答
1

你为什么不这样做,你的生活会很好。

class VehicleLot : List<Vehicle>
{

}

现在VehicleLot是您的集合类。您可以像对任何其他集合一样执行任何操作。

用法:

VehicleLot list = new VehicleLot();
list.Add(new Vehicle()); // you can add as many Vehicles as you want
于 2012-10-15T02:33:53.467 回答
1

通常,当您的类本身不实现 IEnumerable 时会更好。您可以只创建一个属性并将您的列表作为 IEnumerable 返回:

namespace Generic_cars
{
 class VehicleLot
 {
    public List<Vehicle> Lot = new List<Vehicle>();

    IEnumerable<Vehicle> Vehicles
    {
        return Lot;
    }
 }
}
于 2012-10-15T02:44:10.093 回答