我是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;
}
答案 0 :(得分:4)
您需要了解scope - 特别是块范围。
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[] {};
答案 1 :(得分:2)
您需要在if
块之外创建新闻(仅一次)。
这里重要的概念是变量的“范围”。在C#中声明变量时,它仅存在于包含声明的{
... }
的最里面集之间。
因此,在您的代码中,如果名称为"news"
,则创建一个名为newsy
的新字符串变量 - 但该变量位于{
... {{1在}
之后,一旦程序退出它们就消失了。如果名称为if
,则创建一个名为"link"
的(另一个!)新字符串变量,但该变量在newsy
的末尾也会消失。无论哪种方式,当你到达if
语句时,仍然没有return
。
所以你需要在newsy
语句的同一级别声明newsy
- 在函数体周围的大括号内,但不要在return
体周围的任何一个或任何while
s:
if
...
现在,您还必须更改赋值,因为如果在其中一个内部块中执行 XmlTextReader textReader = new XmlTextReader(URL);
string[] newsy;
while (textReader.Read())
{
,您仍将创建一个仅存在于该块内并隐藏外部块的新变量。因此,不要声明它(使用string[] newsy
),而只是分配给现有的,没有类型声明:
string[]
这应该有用。
答案 2 :(得分: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;
}
答案 3 :(得分: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;
}
答案 4 :(得分: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;
答案 5 :(得分:0)
在while语句之前声明string[] newsy;
,然后像这样使用newsy:
newsy = {Link}
,这将解决您的问题。