0

我是 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;
    }
4

6 回答 6

4

您需要了解范围- 特别是块范围。

newsy在语句的内部范围内return声明,在该范围内不可用。

在外部范围内声明它,你会没事的:

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"or "link"newsy将会是null- 它可能是也可能不是您想要的 - 您始终可以在声明期间分配一个空字符串数组:

string[] newsy = new string[] {};
于 2013-03-21T20:23:11.643 回答
2

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

这里的重要概念是变量的“范围”。当你在 C# 中声明一个变量时,它只存在于包含声明的最里面{的...集合之间。}

因此,在您的代码中,如果名称是"news",您将创建一个名为newsy- 的新字符串变量,但该变量位于{...}之后的集合中if,并且一旦程序退出它们就消失了。如果名称是"link",您将创建一个(不同的!)名为 的新字符串变量newsy,但它也会在它的末尾消失if。无论哪种方式,当你得到return声明时,仍然没有newsy

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

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

...

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

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

这应该有效。

于 2013-03-21T20:22:47.573 回答
2

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

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;
    }
于 2013-03-21T20:24:06.273 回答
1

试试这个:

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;
        }
于 2013-03-21T20:23:30.253 回答
1

当你在一个块(即使是一个 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;
于 2013-03-21T20:25:18.847 回答
0

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

于 2013-03-21T20:24:36.660 回答