该名称不存在.在if中设置变量

本文关键字:设置 变量 if 不存在 | 更新日期: 2023-09-27 18:05:06

我是c#初学者,我正在制作一个简单的应用程序。但是我仍然不明白如何从这个函数返回这个名为"newsy"的数组。我不能在数组中设置这个变量。我得到了这个错误:

名称"newsy"在当前上下文中不存在。

请帮帮我。

private string[] get_news(string URL)
    {
        XmlTextReader textReader = new XmlTextReader(URL);
        while (textReader.Read())
        {
            if (textReader.NodeType == XmlNodeType.Element)
            {
                if (textReader.Name == "news") {
                    string News = textReader.ReadElementContentAsString();
                    string[] newsy = { News };
                }
                if (textReader.Name == "link")
                {
                    string Link = textReader.ReadElementContentAsString();
                    string[] newsy = { Link };
                }
            }
        }
        return newsy;
    }

该名称不存在.在if中设置变量

你需要了解作用域,特别是块作用域。

newsyreturn语句的内部作用域中声明,在这里它不可用。

在外部作用域中声明它,你就可以了:

private string[] get_news(string URL)
{
    XmlTextReader textReader = new XmlTextReader(URL);
    string[] newsy = null;
    while (textReader.Read())
    {
        if (textReader.NodeType == XmlNodeType.Element)
        {
            if (textReader.Name == "news") {
                string News = textReader.ReadElementContentAsString();
                newsy = new string[] { News };
            }
            if (textReader.Name == "link")
            {
                string Link = textReader.ReadElementContentAsString();
                newsy = new string[] { Link };
            }
        }
    }
    return newsy;
}

注意newsy是如何在while块之外声明的(但没有分配给)。也可以看到在while内部,有对newsy的赋值,但没有新的声明(这将是不合法的)。

值得注意的是,如果Name既不是"news"也不是"link",那么newsy将是null——它可能是也可能不是你想要的——你可以在声明期间始终赋值一个空字符串数组:

string[] newsy = new string[] {};

您需要在while循环之外声明newsy:

private string[] get_news(string URL)
    {
        string [] newsy;
        XmlTextReader textReader = new XmlTextReader(URL);
        while (textReader.Read())
        {
            if (textReader.NodeType == XmlNodeType.Element)
            {
                if (textReader.Name == "news") {
                    string News = textReader.ReadElementContentAsString();
                    newsy = { News };
                }
                if (textReader.Name == "link")
                {
                    string Link = textReader.ReadElementContentAsString();
                    newsy = { Link };
                }
            }
        }
        return newsy;
    }

您需要在if块之外创建新闻(只需一次)。

这里的重要概念是变量的"作用域"。当你在c#中声明一个变量时,它只存在于{最内层集合之间…}包含声明。

所以在你的代码中,如果名字是"news",你创建了一个新的字符串变量newsy -但是这个变量存在于{的集合中…if之后的},一旦程序退出它们就消失。如果名称是"link",则创建一个名为newsy的(不同的!)新字符串变量,但它也会在if的末尾消失。无论哪种方式,当您到达return语句时,仍然没有newsy了。

因此,您需要在与return语句相同的级别声明newsy—在函数体周围的大括号内,而不是在while体周围的大括号内或任何if语句中:

    XmlTextReader textReader = new XmlTextReader(URL);
    string[] newsy;
    while (textReader.Read())
    {

现在,您还必须更改赋值,因为如果您在其中一个内部块中执行string[] newsy,您仍然将创建一个只存在于该块内部而隐藏外部块的新变量。因此,与其声明它(使用string[]),不如将其赋值给现有的,不需要类型声明:

            if (textReader.Name == "news") {
                string News = textReader.ReadElementContentAsString();
                newsy = { News };
            }

应该可以了

try this:

private string[] get_news(string URL)
        {
            XmlTextReader textReader = new XmlTextReader(URL);
            string[] newsy=null;
            while (textReader.Read())
            {
                if (textReader.NodeType == XmlNodeType.Element)
                {
                    if (textReader.Name == "news") {
                        string News = textReader.ReadElementContentAsString();
                         newsy = { News };
                    }
                    if (textReader.Name == "link")
                    {
                        string Link = textReader.ReadElementContentAsString();
                         newsy = { Link };
                    }
                }
            }
            return newsy;
        }

当你在一个块(即使是if块)中声明一个变量时,它的作用域仍然在那个级别:

if (textReader.Name == "news") {
    string News = textReader.ReadElementContentAsString();
    string[] newsy = { News };
}
// newsy no longer exists

为了返回newsy,你要么需要在外部作用域声明,要么立即返回。

    XmlTextReader textReader = new XmlTextReader(URL);
    string[] newsy;
    while (textReader.Read())
    {
        if (textReader.NodeType == XmlNodeType.Element)
        {
            if (textReader.Name == "news") {
                string News = textReader.ReadElementContentAsString();
                newsy = { News };
            }
            if (textReader.Name == "link")
            {
                string Link = textReader.ReadElementContentAsString();
                newsy = { Link };
            }
        }
    }
    return newsy;

在while语句之前声明string[] newsy;,然后像这样使用newsy:newsy = {Link},这将解决您的问题