C#名称“ ...”在当前上下文中不存在

时间:2018-09-16 13:19:54

标签: c# syntax-error

我是C#的新手,我尝试从最基础的方面学习它,但是我坚持使用类。我制作了第一个示例来进行实践,但该示例工作正常,但是当我添加一些复杂性时,我会得到一个错误:

“名称“ iArcher”在当前上下文中不存在。”

请帮助解释问题所在,并提出正确(简便)的解决方案。

谢谢!

使用系统;

namespace Units
{
    class Archer
    {
        public int id;
        public int hp;
        public float speed;
        public float attack;
        public float defence;
        public float range;

        public void setProp(int id, int hp, float sp, float at, float de, float ra)
        {
            this.id = id;
            this.hp = hp;
            speed   = sp;
            attack  = at;
            defence = de;
            range   = ra;
        }

        public string getProp()
        {
            string str = "ID        = " + id +      "\n" +
                         "Health    = " + hp +      "\n" +
                         "Speed     = " + speed +   "\n" +
                         "Attack    = " + attack +  "\n" +
                         "Defence   = " + defence + "\n" +
                         "Range     = " + range +   "\n" ;

            return str;
        }

        static void Main(string[] args)
        {
            string input = Console.ReadLine();

            if (input == "create: archer")
            {
                Archer iArcher = new Archer();
                iArcher.setProp(100, 20, 4f, 8f, 3.5f, 25f);
            }

            if (input == "property: archer")
            {
                Console.WriteLine(iArcher.getProp());    // ERROR!
            }
            Console.ReadLine();
        }
    }
}

2 个答案:

答案 0 :(得分:2)

C#具有作用域。范围内的项目可以看到包含它的范围内的所有内容,但外部范围在内部范围内看不到。您可以阅读有关范围here的信息。

以您的示例为例:

if (input == "create: archer")
{
    Archer iArcher = new Archer();
    iArcher.setProp(100, 20, 4f, 8f, 3.5f, 25f);
}

iArcher在您的if语句的范围内,因此if语句看不到该代码之外的代码。

要解决此问题,请将定义或iArcher移至if语句之外:

Archer iArcher = new Archer();
if (input == "create: archer")
{
    iArcher.setProp(100, 20, 4f, 8f, 3.5f, 25f);
}

if (input == "property: archer")
{
    Console.WriteLine(iArcher.getProp());
}

请注意,这现在给您带来另一个问题:input不能同时是“ create:archer”和“ property:archer”。

一种解决方案可能是将读取用户输入内容移入一个循环中,同时将iArcher保留在该循环外:

Archer iArcher = new Archer();
string input = null;

while ((input = Console.ReadLine()) != "exit")
{
    if (input == "create: archer")
    {
        iArcher.setProp(100, 20, 4f, 8f, 3.5f, 25f);
    }
    else if (input == "property: archer")
    {
        Console.WriteLine(iArcher.getProp());
    }
}

要退出循环,只需输入“ exit”作为输入。

答案 1 :(得分:1)

移动此行:

  

Archer iArcher = new Archer();

if块之外,它将起作用。