5

配列を使用して汎用スタックを実装しています。しかし、私は次のようにエラーが発生します:

タイプ 'T' の式に [] を使用したインデックス付けを適用することはできません

行で:

 data[SP] = data;

問題を解決するには?また、私はこのリンクをチェックしました:

タイプ 'T' の式に索引付けを適用できません

私の状況でもここで同じ修正を実装する必要がありますか? または他に利用可能な最良のオプションはありますか?

これが私のコードです:

public class MyStack<T> 
{
    private T[] data { get; set; }
    private int SP { get; set; }
    private int Capacity { get; set; }
    public MyStack(int capacity)
    {
        this.Capacity = capacity;
        data = new T[Capacity];
        SP = -1;
        // it works here, dont know why??? ;)
        data[0] = default(T);
    }
    public void Push(T data)
    {
        ++SP;
        if(SP>=Capacity) growArray();
        // This is where i get error.
        data[SP] = data;
    }
    public T Pop()
    {
        if (SP < 0) throw new InvalidOperationException();
        T value = data[SP];
        data[SP] = default(T);
        SP--;
        return value;
    }
    public T Peak()
    {
        if (SP < 0) throw new InvalidOperationException();
        return data[SP];
    }
    private void growArray()
    {
        throw new NotImplementedException();
    }
}

前もって感謝します。

4

4 に答える 4

5

仮パラメータについて考えdataているときは仮パラメータを意味し、フィールドについて考えているときはforを意味することを期待していると思います。C# コンパイラはユーザーの心を読み取ることができません。この場合、常に配列ではない仮パラメータを意味します。datathis.datadata

「data」の代わりに、配列に「values」という名前を付け、プッシュされる値に「value」という名前を付けます。

また、private フィールドの代わりに private の自動プロパティを使用することは合法ですが、珍しいことです。そんなことをしているのには何か理由がありますか?ほとんどの人は、パブリック プロパティ、プロテクト プロパティ、または内部プロパティの自動プロパティのみを使用します。

于 2012-12-27T14:35:07.577 に答える
5

これは範囲の問題です。

data[SP] = data;

dataどちらの場合も、 ではなくdata型のローカル パラメータを参照しているため、エラーが発生します。ローカル変数の名前を変更するか、次を使用してメンバー変数を明示的に参照できます。TT[]this

this.data[SP] = data;
于 2012-12-27T14:32:22.490 に答える
4

メソッド (Push) のパラメータ「data」の名前を別の名前に変更する必要があります。

        public void Push(T d)
        {
         .
         .
         data[SP] = d;
         .
         .

同じ名前のフィールドとパラメーターがある場合、パラメーターはより強力です。または、「this」キーワードを使用してこの行を次のように変更できます。

        this.data[SP] = data;

ちなみに、教育上の理由で実装している場合を除いて、Stack<T>.net ready made classを使用できます。

これは.net Ready MadeのコードですStack<T>

于 2012-12-27T14:29:58.840 に答える
1

Push()と呼ばれるパラメーターがありますdata。コンパイラは、 と呼ばれるプロパティではなく、より狭い範囲の変数を使用することを好みますdata。パラメーターは であり、TではないためT[]、インデクサーを使用してアクセスすることはできません。

解決策は、単にそのパラメーターの名前を変更するか、this.data. パラメータの名前を変更することを強くお勧めします。

于 2012-12-27T14:32:43.943 に答える