该名称不存在.在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;
}
你需要了解作用域,特别是块作用域。
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"
也不是"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}
,这将解决您的问题