2013-07-22 8 views
0

Я получаю следующее сообщение об ошибке:System.InvalidCastException: Невозможно привести объект типа

Unable to cast object of type 'Holo.Virtual.Rooms.Bots.virtualBot' to type 'Holo.Virtual.Rooms.Bots.virtualRoomBot'.

Вот мой код:

foreach (virtualRoomBot roomBot in _Bots.Values) // Exception thrown here 
{      
    if (roomBot.goalX == -1) 
     continue; 

Holo.Virtual.Rooms.Bots.virtualBot содержит:

public class virtualBot 
{ 
    public virtualBot(int botID) 
    { 
     DataRow dRow; 
     using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) 
     { 
      dRow = dbClient.getRow("SELECT * FROM roombots WHERE id = '" + botID + "'"); 
     } 
     *There are values for the db here* 
    } 
} 

И Holo.Virtual.Rooms.Bots.virtualRoomBot содержит:

public class virtualRoomBot 
{ 
    internal virtualRoomBot(int botID, int roomID, int roomUID, 
     virtualBot Bot, virtualRoomBotStatusManager statusManager) 
    { 
     this.botID = botID; 
     this.roomID = roomID; 
     this.roomUID = roomUID; 
     this.Bot = Bot; 
     this.statusManager = statusManager; 
    } 
+0

'virtualBot' и' virtualRoomBot' - два разных и несвязанных типа. Вы не можете напрямую переводить из одного в другое. Если '_Bots.Values' содержит коллекцию объектов типа' virtualBot', то вы не можете рассматривать ее как набор объектов типа 'virtualRoomBot', который вы пытаетесь сделать. Помимо этого, неясно, что именно вы пытаетесь сделать или где вы получаете '_Bots.Values'. – David

ответ

2

_Bots.Values представляет собой набор virtualBot и ваш код должен быть

foreach (virtualBot roomBot in _Bots.Values) 
{      
    if (roomBot.goalX == -1) 
     continue; 
0

Вы должны изменить свой foreach заявление следующим образом:

foreach (virtualBot roomBot in _Bots.Values) 

Или вы могли бы опустить тип явного класса и просто использовать неявный тип var:

foreach (var roomBot in _Bots.Values) 

Я также подозреваю, что, поскольку вы специально тестируете значение roomBox.goalX, вы можете фактически переименовать неверный список. Вы на самом деле имели в виду итерацию на _Bots.Values? Может быть, у вас есть _RoomBots.Values?

0

Посмотрите на этот код:

public class A { } 
public class B : A { } 

A a = new A(); 
B b = (B)a; 

Этот код выше будет давать «Невозможно привести объект типа„А“к типу„B“.» То же самое происходит с вашим образцом кода.

Если вы создаете экземпляр virtualBot, вы не можете просто направить его на virtualRoomBot.

Вы должны сделать один класс наследованием другого. Затем выполните броски в направлении, которое я покажу в приведенном ниже коде:

public class A { } 
public class B : A { } 

A a = new B(); 
B b = (B)a; 

Это должно работать. Надеюсь, поможет. С уважением

Смежные вопросы