繁体   English   中英

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

[英]The name does not exist. Setting variables inside if

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

您需要了解范围 -尤其是块范围。

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;
}

注意在while块外如何声明(但不分配给) newsy 另请参阅while ,如何对newsy进行了赋值,但是没有新的声明(这是不合法的)。

值得注意的是,如果Name是没有一个"news""link"newsy将是null -这可能是也可能不是你想要的东西-你可以声明中始终分配一个空字符串数组:

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

您需要在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 };
            }

那应该起作用。

您需要在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;
    }

尝试这个:

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

为了返回新闻,您需要在外部范围内声明或立即返回它。

    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;

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM