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""link"newsynull

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

ブロックの外でニュースを作成する必要がありifます(1回だけ)。

ここで重要な概念は、変数の「スコープ」です。C#で変数を宣言すると、宣言を含む...の最も内側のセットの間にのみ存在します。{}

したがって、コードでは、名前が"news"、の場合、-という新しい文字列変数を作成しますが、その変数は、の後にある...newsyのセット内にあり、プログラムが終了すると削除されます。名前が、の場合、と呼ばれる(異なる!)新しい文字列変数を作成しますが、それはその最後でもなくなります。いずれにせよ、あなたが声明にたどり着くまでには、もう何もありません。{}if"link"newsyifreturnnewsy

newsyしたがって、ステートメントと同じレベルで宣言する必要がありますreturn。関数本体の周りの中括弧の内側ですが、while本体またはifsの周りの中括弧の内側ではありません。

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

..。

ここで、割り当ても変更する必要があります。string[] newsyこれらの内側のブロックの1つで行う場合でも、そのブロックの内側にのみ存在し、外側のブロックを非表示にする新しい変数を作成するためです。したがって、(で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 に答える