【问题标题】:Add to a list of a generic List<T>添加到通用 List<T> 的列表
【发布时间】:2015-05-18 20:50:12
【问题描述】:

假设我有一个List&lt;T&gt; ListOfParts = new List&lt;T&gt;;在类公共类汽车内。我想在ListOfParts 列表中添加一个新的“零件”对象。我收到以下错误(见下文)。我做错了什么?

public class Car
{
    public List<T> ListOfParts = new List<T>();
      :
      :
}

// Main ...
 Car<Part> myCar = new Car<Part>();
 Part myPart = new Part();
 myCar.ListOfParts.Add(myPart);  // <<< Error here

错误 CS1502:System.Collections.Generic.List.Add(T) 的最佳重载方法匹配有一些无效参数 (CS1502)

【问题讨论】:

  • 你为什么有Car&lt;T&gt;Car的声明中T的作用是什么?您似乎误解了如何使用泛型 - Car&lt;Part&gt; 对我来说根本没有意义。拥有Car 并不意味着任何特定的Part - Car-s 由Part-s 组成,但Car-s 不是Part-s 的种类。
  • 不,你不是... ideone.com/tJN19G 我看到的唯一问题是你使用的是mrCar.ListOfParts 而不是myCar
  • 你拼错了mrCar。否则它应该编译。也许你没有向我们展示的东西。 class Part?
  • 我不需要 作为类 car 定义的一部分,所以 ListOfParts 使用 有效吗?否则编译器会说它不知道 T 是什么
  • 请贴出真实代码。在class Car 之后添加&lt;T&gt; 是让您的代码正常工作所需的全部内容(我假设是错字)。 dotnetfiddle.net/4pvLd6 - 你说的地方没有错误。

标签: c# .net list generics


【解决方案1】:

您必须将您的类 Car 声明为泛型类型:

public class Car<T>
{
    public List<T> listOfParts = new List<T>();
}

这允许您传递需要在编译时定义的泛型类型参数

您在声明Car&lt;&gt; 变量时分配的类型将传递给成员listOfParts

Car<Integer> carWithIntegerList;
Car<Owners> carWithOwnersList;
// etc..

注意:

其中一位 cmets 已经说过:你不应该那样做。您应该像这样在类声明列表的泛型类型:

public class Car
{
    public List<Part> listOfParts = new List<Part>();
}

public class Part
{
    // ..
}

public class CustomPart extends Part
{
    // ..
}

// 

Car car = new Car();
car.listOfParts(new Part());
car.listOfParts(new CustomPart());

另外:您可能希望将listOfParts 设为私有并为其编写一个getter 函数:

public List<Part> getListOfParts() { 
    return this.listOfParts; 
}

如果您注意到我在成员名称中使用了小写字母。看看code conventions for Javapolymorphism(请参阅下面的评论),这解释了为什么添加CustomPart 仍然有效。

【讨论】:

  • 问题是我希望能够从 Parts 派生一个类(例如:CustomParts : Parts)并将其添加到 ListOfParts。但是编译器会抱怨 CustomParts 不是“Parts”对象。
  • @user1930748 不,如果 custompart 确实子类化部件,则将其添加到 listofparts 应该没有问题。
  • @user1930748 正如安迪所说,如果你有class CustomParts extends Parts,这不是问题。在这种情况下,您仍然可以使用 List&lt;Parts&gt; 作为您的成员的类型。看看polymorphism
【解决方案2】:

我不确定您要做什么,因此我的回答是假设您正在尝试以“通常”方式对 Car 类进行建模。如果这不是您所追求的,则此答案可能不适用。

Car 类中的零件列表不需要是通用的 - 汽车没有不同的类型轮胎 - 它们有不同的型号轮胎,但它们仍然是所有轮胎。引擎、座椅等也是如此——所有这些组件都只是Part 的子类型。你可以有一个通用的Part 类,然后你可以从中派生出你的专用汽车零件——也许是TireEngine(然后是V4EngineV6Engine,...)等等。

public class Car
{
    public List<Part> ListOfParts = new List<Part>();

    // ...
}

public abstract class Part
{
    // ...
}

public class Tire : Part
{
    // ...
}

// Main ...
Car myCar = new Car ();
Tire myTire = new Tire ();

myCar.ListOfParts.Add ( myTire );

请注意,Part 是一个抽象类 - 仅向汽车添加“部件”没有多大意义 - 汽车实际上是由具有共同方面的特定部件组成的:它们都是零件。

这也不一定是表示汽车的最佳方式(也不一定是坏的)——拥有Part-s 的开放列表使得难以强制执行验证。使用开放列表,调用者可以为应该只有 4 个的汽车添加 7 个轮胎,或者在大多数汽车只有 1 个时添加 3 个方向盘。

由于该列表可公开访问,因此您的 Car 实例无法知道其部件列表的更改。通常最好防止不良数据的形成(防止添加无效项目),而不是试图在事后清除不良数据(检查列表并计算每个部分,确保每个部分的数量正确)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-02
    • 1970-01-01
    • 2014-04-14
    • 2015-11-18
    • 1970-01-01
    相关资源
    最近更新 更多