【问题标题】:Return ambiguous object in C#在 C# 中返回不明确的对象
【发布时间】:2015-11-10 19:33:59
【问题描述】:

我目前正在大学一年级制作游戏。我有四个敌人对象(兽人、精灵、地精和爬行动物)我想根据玩家当前所在的级别和房间创建每个敌人的对象并返回该特定敌人的对象数组。我收到错误“名称“敌人”在当前上下文中不存在”。提前谢谢你。

public Object[] level(int lev, int room){
                int enemiesToCreate = 2;
                enemiesToCreate += lev += room;
                if (lev == 1)
                {
                    Goblen[] enemies = new Goblen[enemiesToCreate];
                }
                else if (lev == 2)
                {
                    Orc[] enemies = new Orc[enemiesToCreate];
                }
                else if (lev == 3)
                {
                    Elf[] enemies = new Elf[enemiesToCreate];
                }
                else if (lev == 4)
                {
                    Reptilian[] enemies = new Reptilian[enemiesToCreate];
                }

                // error here
                return enemies;

            }

【问题讨论】:

  • 您有 4 个独立的 enemies 变量。它们只存在于if 块内。在if 语句之外声明敌人。研究变量范围。或者将 return 语句移到 if 语句中。
  • 你可以为你的敌人类型创建一个通用的基类或接口并返回它。它必须只声明一次,而不是在每个 if/else 分支中,例如IEnemy[] enemies。或者你也可以return 例如new Reptilian 而不是赋值。使用object 作为返回类型也不是您可以采用的最佳方法。

标签: c# arrays object


【解决方案1】:

您必须在 if 块之外定义 enemies。当你用 {} 括号括起来时,它基本上会创建一个额外的范围级别,通常称为块,外部级别不会看到。因此,例如,以下内容将不起作用:

if (lev == 1)
{
  Goblen[] enemies = new Goblen[enemiesToCreate];
}

return enemies;

但是,如果我们在 if 块之外声明敌人,return 语句将能够“看到”声明。例如:

object[] enemies;

if (lev == 1)
{
   enemies = new Goblen[enemiesToCreate];
}

return enemies;

请注意,由于您使用不同的返回类型,因此您必须为返回变量使用通用的基本类型。 object 始终有效,但更具体的内容会更好。

此外,在这种特殊情况下,最好完全跳过返回变量,直接从 if 语句中返回,如下所示:

public Object[] level(int lev, int room){
  int enemiesToCreate = 2;

  enemiesToCreate += lev += room;

  if (lev == 1)
  {
    return new Goblen[enemiesToCreate];
  }
  else if (lev == 2)
  {
    return new Orc[enemiesToCreate];
  }
  ...
  throw new Exception("Unknown enemy type");
}

【讨论】:

  • 您的第二个示例不起作用,您需要删除Goblen[] 并分配给enemies
【解决方案2】:

使类Goblen, Orc, Elf, Reptilian 继承自抽象类或接口。在if 声明之外声明该类型的敌人。可能您会发现为您的案例实现抽象工厂设计模式是有益的。

【讨论】:

    猜你喜欢
    • 2013-10-26
    • 2010-09-17
    • 1970-01-01
    • 2017-10-24
    • 1970-01-01
    • 1970-01-01
    • 2014-03-06
    • 2016-06-22
    • 2017-10-31
    相关资源
    最近更新 更多