-2

私の質問は本当に単純ですが、何時間も Google を検索しても、私の (明らかに) 独特な状況に対する答えが得られません。問題は、次のコードで割り当てられていない変数を使用していることです

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SimpleBasicCompiler
{
    class Lines : System.Collections.IEnumerable
    {
        // Variables
        private ArrayList<string> lines;

        // Constructor
        public Lines()
        {
            lines = new ArrayList();
        }

        public void Add(string line)
        {
            lines.add(line);
        }

        // Iterator
        public System.Collections.IEnumerator GetEnumerator()
        {
            for (int i = 0; i < lines.length(); i++)
            {
                yield return lines[i];
            }
        }

        public void Print()
        {
            foreach (string line in lines)
            {
               XFormMain.SetStatus(line); // this line errors
               System.Console.Write(line); // this line dosn't
            }
        }

    } // End Class Lines
} // End namespace

私の質問はなぜですか?宣言を変更できないか、イテレータ構文が無効になります。次のことも試しました

public void Print()
    {
        string lineB = "";
        foreach (string line in lines)
        {
           lineB = line; // now this line errors
           XFormMain.SetStatus(lineb); // and this line doesn't
           System.Console.Write(line); // this line doesn't in either situation
        }
    }

なぜ1行が機能し、1行が機能しなかったのかを知っていれば、それを理解できたと思いますが、...何かアイデアはありますか?

4

3 に答える 3

1

投稿したコードには重大な問題があります (メソッドがなくてもコンパイルできませんPrint)。ArrayList<T>クラスが存在しません。そうあるべきだとList<string>思います。の適切な使用法はまだ見たことがありArrayListません。

あなたが得るエラーはおそらくArrayList型付けされていないためです(これがリストの実装をひどいものにしています)が、文字列を要求しています。コンパイラは、任意のオブジェクトが含まれている可能性があることを認識しており、文字列のみであると想定するのを防ぎます。

2 行目でエラーが発生しないのは、最初のエラーでコンパイラが停止したためだと思います。

于 2012-05-08T23:03:04.580 に答える
0

これを試して:

foreach (string line in lines.ToArray(typeof(string)))         
{
于 2012-05-08T22:58:44.280 に答える
0

これはコンパイルされます:

    class Lines : System.Collections.IEnumerable {
        // Variables
        private ArrayList lines;

        // Constructor
        public Lines() {
            lines = new ArrayList();
        }

        public void Add(string line) {
            lines.Add(line);
        }

        // Iterator
        public System.Collections.IEnumerator GetEnumerator() {
            for (int i = 0; i < lines.Count; i++) {
                yield return lines[i];
            }
        }

        public void Print() {
            string lineB = "";
            foreach (string line in lines)
            {
               lineB = line;
//               XFormMain.SetStatus(lineb);
               System.Console.Write(line); 
            }
        }
    }

いくつかの問題がありました:

ArrayList は System.Collections.Generic ではなく System.Collections にあります

ArrayList はジェネリックではないため、ArrayList<string>正しくありません

ArrayList.add が存在しません

ArrayList.length() が存在しません

ここに役立つかもしれない提案があります。最初に少しコーディングして、コンパイルされることを確認します。空のクラス宣言から始めます。クラスが別のクラスの子孫である場合は、次のクラスを追加し、基本クラスまたはインターフェイスで必要なメソッドをスタブ化してコンパイルします。メソッドの内部を一度に 1 つずつ追加し、それぞれを終了するたびにコンパイルします。このように頻繁にコンパイルすると、コード内の複数のエラーによって引き起こされる奇妙な問題を回避できます。また、ArrayListをジェネリックとして使用するなど、間違ったトラックに向かうのを早期に停止します。

于 2012-05-08T23:20:19.070 に答える