2010-12-02 116 views
0

我有一个程序,有一个超级车辆,并有3个类继承它汽车,卡车,小巴我需要采取类的实例,并显示它们在我的主窗体'FrmHire'上的列表框中我为此,有一个叫做舰队的班级。不能隐式转换类型

我不断收到此错误,

不能键入App1.Vehicle隐式转换为App1.Car。一个显式转换存在(是否缺少强制转换?)

private void lstFleet_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     /* 
     * This method is used to control the list box 
     * It is called when a row is selected by the user, it then displays frmCar 
     * with the car details 
     */ 
     if (lstFleet.SelectedIndex > -1) 
     { 
      int index = lstFleet.SelectedIndex; 
      Car myCar = myFleet.fleet.ElementAt(index); 
      FrmCar carGui = new FrmCar(); 
      carGui.car = myCar; 
      carGui.Show(); 
     } 
    } 
+0

你可以指向抛出一个错误的行? – 2014-12-17 20:19:14

回答

1

鉴于您的列表可能包含汽车,卡车和小轿车,你可以假设你可以采取的ElementAt(指数),并将其转换为租车, 你可以吗?

假设你从ElementAt(索引)获得一辆车,并且如果你知道它将是一辆车,那么你可以明确地将它投射到Car,但是你在这里的隐式转换导致了这个问题。

所以,你要么需要(如果你肯定知道他们都是汽车实例和其他任何除外)...

Car myCar = (Car)myFleet.fleet.ElementAt(index); 

...或者你需要处理这个作为车辆...

Vehicle myVehicle = myFleet.fleet.ElementAt(index); 

如果你想测试的项目是否是汽车(和做一些事情如果没有不同的),那么这...

Car myCar = myFleet.fleet.ElementAt(index) as Car; 
if (myCar != null) 
{ 
    // it was a car 
} 
+0

第一个工作,但在列表框中,它抛出的解决方案的名称然后a。然后汽车,而不是汽车:?有任何想法吗? – bettsy583 2010-12-02 21:23:08

0

myFleet.fleet的类型是什么?我怀疑这是一辆车的集合,你正试图将一辆车分配给一辆车。

+0

是的,没错! – bettsy583 2010-12-02 21:21:18

0
Car myCar = (Car)myFleet.fleet.ElementAt(index); 

如果myFleet.fleet.ElementAt(index);不是Car这会抛出异常。要检查它是否为Car,您可以执行if (myFleet.fleet.ElementAt(index) is Car) {...}。但最好是使用List<Car>而不是List<Vehicle>,如果你只打算将汽车存储在其中。

+0

这可能会抛出。我更喜欢myFleet.fleet.ElementAt(index)作为Car,所以我可以检查myCar为null。 – n8wrl 2010-12-02 21:18:18

+0

@ n8wrl,我注意到在我的编辑。 – 2010-12-02 21:20:07

0

试试这个:

Car myCar = (Car)myFleet.fleet.ElementAt(index);