2013-03-21 61 views
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

您需要了解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"没有一个,newsynull - 它可能是也可能不是你想要的东西 - 你可以申报过程中始终分配一个空字符串数组:

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

呃,每次我在Newsy之前删除string []我得到12个错误。我 ;预计在这里:“{链接};”和{新闻}上的相同我也试着复制粘贴你的代码,但它没有任何区别。 – 2013-03-21 20:39:04

+0

@Daniel - 你是否在'XmlTextReader'的声明之后注意到'string [] newsy;'?我已经更新了答案,因此它将编译时没有错误。 – Oded 2013-03-21 20:40:35

+0

是的,我做到了。我说我甚至复制粘贴你的代码。 :/ – 2013-03-21 20:41:59

2

您需要创建if块(只有一次)的报童外。

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

因此,在你的代码,如果名称是"news",创建一个名为newsy新的字符串变量 - 但if后的设定的{ ... }内该变量的生命,而一旦程序退出他们走了。如果名称为"link",则会创建一个名称为newsy的新字符串变量(不同!),但在if的末尾也会消失。无论哪种方式,当你到达return声明时,仍然没有newsy了。

所以你需要在同一水平return语句声明newsy - 函数体周围的括号内,但周围没有while体或任何if S的那些内部:

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

...

现在,你也必须改变分配,因为如果你这样做string[] newsy内的内区块之一,你仍然会创建一个只存在块内,隐藏了一个外一个新的变量。因此,而不是宣布它(与string[]),只是分配给现有的一个,没有类型声明:

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

这应该工作。

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

您需要声明newsywhile循环:

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

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

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

// newsy no longer exists 

为了返回报童您可能需要在外部范围来声明或返回它:

1

在声明块(即使是如果块)内的变量,它保持在该水平范围的立即。

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;