IEnumerable,需要两个实现?

时间:2012-10-15 02:30:25

标签: c# interface

我正在学习实现接口和泛型,我制作了这段代码,但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; };
    }
 }
}

3 个答案:

答案 0 :(得分:7)

您正在实施IEnumerable<Vehicle>,这是一个强类型的通用接口,用于保存Vehicle个对象。但是,该接口来自较旧的IEnumerable interace,它不是通用的,并且可以键入以保存object个对象。

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

此外,您可能希望以您的方式明确实施GetEnumerator<Vehicle>;这将要求您将对象显式转换为IEnumerable<Vehicle>以便使用它们。相反,你可能想要这样做:

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

IEnumerator IEnumerable.GetEnumerator() {
    return GetEnumerator();
}

答案 1 :(得分:1)

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

class VehicleLot : List<Vehicle>
{

}

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

用法:

VehicleLot list = new VehicleLot();
list.Add(new Vehicle()); // you can add as many Vehicles as you want

答案 2 :(得分:1)

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

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

    IEnumerable<Vehicle> Vehicles
    {
        return Lot;
    }
 }
}