【发布时间】:2019-09-13 21:33:48
【问题描述】:
我尝试在数组列表中添加两个类(汽车和货车),但似乎列表是由第一个类(汽车)定义的,当尝试添加另一个类(货车)时,我得到 运行时错误
System.InvalidCastException: '无法转换类型的对象 'CarBroker.Car' 输入 'CarBroker.Van'。
我认为该错误是由在创建“Car”类型的第一个条目时定义的 arraylist 引起的,并且在尝试添加不同类型的“Van”时会发生错误。
还有其他可以代替的列表吗?
public class List // Global ArrayList to store car data
{ public static ArrayList vehicle = new ArrayList(); }
static void Main(string[] args)
{
Car car = new Car();
car.SetVehicleData();
car.SetOwnerData();
List.vehicle.Add(car);
Van van = new Van();
van.SetVehicleData();
van.SetCompanyData();
List.vehicle.Add(van);
Admin a1 = new Admin();
a1.ListAll();
Console.ReadKey();
}
当运行我的 ListAll() 方法时,理想的输出将是第一个列表条目与类 'car' 和第二个条目与类 'van'
相反,我得到了上面提到的错误。
谁能帮助我使用正确的列表或其他功能?我正在上一个基本的 C# 课程,所以我不是那么先进 :)
【问题讨论】:
-
Car和Van是否共享除Object之外的接口/基类?如果是这样,请使用List<YourBase> -
创建一个基类 Vehicle 并让 Van 和 Car 继承 Vehicle 类。
-
您有多种选择。要么让这两个类从一个公共基类型继承并让列表包含该基类型,要么你可以将其中一种类型(例如 car)作为另一种的基类型。您还可以让这两种类型都实现一个通用接口,并让列表脱离该接口,或者您可以让列表只包含
object元素,它可以包含任何东西。 -
顺便说一句,请阅读What's Wrong with an ArrayList?。
-
不,列表将保留您的新属性,但是当您遍历列表时,您必须测试对象。例如: foreach (Vehicle in List 中的车辆) { if (vehicle is Car) { Car car = vehicle as Car car.customProp } if (vehicle is Van) { Van van = vehicle as Van van.VanCustomProp } }
标签: c#