【问题标题】:System.InvalidCastException: Unable to cast object of typeSystem.InvalidCastException:无法转换类型的对象
【发布时间】:2013-07-22 02:25:42
【问题描述】:

我收到以下错误:

无法将“Holo.Virtual.Rooms.Bots.virtualBot”类型的对象转换为“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;
    }

【问题讨论】:

  • virtualBotvirtualRoomBot 是两种不同且不相关的类型。您不能直接从一个投射到另一个。如果_Bots.Values 包含virtualBot 类型的对象的集合,那么您不能将其视为virtualRoomBot 类型的对象的集合,您正在尝试这样做。除此之外,尚不清楚您要做什么或从哪里获得_Bots.Values

标签: c# object foreach .net


【解决方案1】:

_Bots.ValuesvirtualBot 的集合,您的代码应该是

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

【讨论】:

    【解决方案2】:

    你应该修改你的foreach声明如下:

    foreach (virtualBot roomBot in _Bots.Values)
    

    或者你可以省略显式类类型而只使用隐式类型var

    foreach (var roomBot in _Bots.Values)
    

    我还怀疑,由于您专门测试 roomBox.goalX 的值,您实际上可能完全在错误的列表上进行迭代。您是否真的打算在 _Bots.Values 上进行迭代?也许你有一个_RoomBots.Values

    【讨论】:

      【解决方案3】:

      看看这段代码:

      public class A { }
      public class B : A { }
      
      A a = new A();
      B b = (B)a;
      

      上面的代码将给出“无法将'A'类型的对象转换为'B'类型。”您的代码示例也发生了同样的事情。

      如果你实例化一个virtualBot,你就不能把它转换成virtualRoomBot

      你应该让一个类继承另一个类。然后,按照我在下面的代码中显示的方向进行强制转换:

      public class A { }
      public class B : A { }
      
      A a = new B();
      B b = (B)a;
      

      这应该有效。希望能帮助到你。 最好的问候

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-11-18
        • 2020-04-16
        • 2020-05-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多