代码之家  ›  专栏  ›  技术社区  ›  abenci

传递接口集合

  •  5
  • abenci  · 技术社区  · 16 年前

    假设您有以下类:

    class Car : IPainting
    {
     ...
    }
    

    然后是这样一个函数:

    void AddCars(IEnumerable<Car> collection)
    

    然后是这样的代码片段:

    Car bmw = new Car();
    Car mercedes = new Car();
    
    IPainting a = (IPainting) bmw;
    IPainting b = (IPainting) mercedes;
    
    IPainting[] paintings = new IPainting[] {a, b};
    
    AddCars(paintings); // fails to compile
    

    谢谢

    4 回复  |  直到 16 年前
        1
  •  3
  •   Fredrik Mörk    16 年前

    C#4将不允许您编写的代码,因为方法 AddCars 期待 IEnumerable<Car> 实现哪一个 IPainting . 这并不意味着你可以通过考试 任何 类实现 (例如,你可以有一个 class Bike : IPainting Car 不管怎样。然而,另一种方式是允许的;如果你有 void AddCars(IEnumerable<IPainting> collection) 你可以通过考试 List<Car> 对方法进行了修改。

    汽车 通过使用一些浇铸机制(例如 painting.Cast<Car>()

        2
  •  8
  •   Nick Craver    16 年前

    尝试使用通用方法:

    void AddCars<T>(IEnumerable<T> collection) where T : IPainting
    
        3
  •  4
  •   Klaus Byskov Pedersen    16 年前

    AddCars(paintings.Cast<Car>());

        4
  •  4
  •   Chris Stavropoulos    16 年前

    AddCars(new Car[] { bmw, mercedes });