C# 添加到通用列表的列表中<;T>;

C# 添加到通用列表的列表中<;T>;,c#,.net,list,generics,C#,.net,List,Generics,假设我有一个列表listoparts=新列表;在一辆普通车里。我想在listoparts列表中添加一个新的“Part”对象。我得到以下错误(见下文)。我做错了什么 public class Car { public List<T> ListOfParts = new List<T>(); : : } // Main ... Car<Part> myCar = new Car<Part>(); Part myPa

假设我有一个
列表listoparts=新列表
;在一辆普通车里。我想在
listoparts
列表中添加一个新的“Part”对象。我得到以下错误(见下文)。我做错了什么

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
公车
{
公共列表ListOfParts=新列表();
:
:
}
//主。。。
我的车=新车();
零件myPart=新零件();

myCar.listoparts.Add(myPart);// 您必须将您的类
Car
声明为泛型类型:

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

其中一条评论已经指出了这一点:你不应该这样做。您应该在类中声明列表的泛型类型,如下所示:

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

如果你注意到我使用小写字母作为成员名称。请看一看并(参见我下面的评论),这解释了为什么添加
定制部件仍然有效。

我不确定您想做什么,因此我的回答与您试图以“常规”方式建模
汽车
类的假设一致。如果这不是你想要的,这个答案可能不适用

您的
汽车
类别中的零件列表不需要是通用的-汽车没有不同类型的轮胎-它们有不同型号的轮胎,但它们仍然都是轮胎。发动机、座椅等也是如此——所有这些部件都只是
零件的子类型。您可以拥有一个通用的
零件
类,然后您可以从中派生您的专用汽车零件-可能是
轮胎
发动机
(然后是
V4发动机
V6发动机
,…),等等

公车
{
公共列表ListOfParts=新列表();
// ...
}
公共抽象类部分
{
// ...
}
公共级轮胎:第1部分
{
// ...
}
//主。。。
Car myCar=新车();
轮胎myTire=新轮胎();
myCar.ListOfParts.Add(myTire);
请注意,
Part
是一个抽象类-仅仅向汽车添加“Part”没有多大意义-汽车实际上是由特定的零件组成的,这些零件都有一个共同的方面:它们都是零件

这也不一定是表示汽车的最佳方式(也不一定是坏的)
-s部分的开放列表使验证难以实施。在一个开放列表中,来电者可以为一辆只有4个方向盘的汽车添加7个轮胎,或者在大多数汽车只有1个方向盘的情况下添加3个方向盘


由于列表是可公开访问的,因此您的
Car
实例无法了解其零件列表的更改。通常情况下,最好防止形成不良数据(防止添加无效项),而不是在事后尝试剔除不良数据(查看列表并计算每个部分,确保每个部分的编号正确)。

为什么有
汽车
T
Car
声明中的目的是什么?似乎您误解了如何使用泛型-
Car
对我来说毫无意义。拥有
汽车
并不意味着任何特定的
零件
-
汽车
-s是由
零件
-s组成的,但是
汽车
-s不是
零件
-s。不,你不是。。。我看到的唯一问题是,您使用的是
mrCar.ListOfParts
而不是
myCar
您拼写错误
mrCar
。否则它应该编译。也许是你没给我们看的东西<代码>类零件
?我不需要作为类汽车定义的一部分,以便列出部分使用的作品吗?否则,编译器会说它不知道什么才是真正的代码。将
添加到
class Car
之后就是让代码正常工作所需的全部内容(我想是打字错误)。-你所说的没有错误,问题是我希望能够从部件(例如:CustomParts:Parts)派生一个类,并将其添加到部件列表中。但是编译器会抱怨CustomParts不是“Parts”对象。@user1930748否,如果custompart确实为Parts子类,则将其添加到listofparts中应该没有问题。@user1930748如Andy所说,如果您有
类CustomParts Extendes
,则这不是问题。在这种情况下,您仍然可以使用
List
作为成员的类型。看一看。
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());
public List<Part> getListOfParts() { 
    return this.listOfParts; 
}
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 );