2

次のような一般的なリストがあるとしましょう。

List<string> list = new List<string>() { "abc", "demo", "stackoverflow" };

このようなスタックの新しいインスタンスを作成しようとすると、機能しません。

Stack<string> stack = new Stack<string>() { "abc", "demo", "stackoverflow" };

コンパイラは、Stack<>にはaddメソッドがないと言っています。そこで、extensionmethodsを使用してaddメソッドを実装しました。

public static void Add<T>(this Stack<T> stack, T item)
{
    stack.Push(item);
}

ただし、コンパイラは同じエラーを出します。しかし、なぜ?コンパイラは今メソッドを見つけるべきではありませんか?さらに、ジェネリックスタックはIEnumerable<>とICollection<>を実装していませんか?スタックにデフォルトでAddメソッドが含まれていないのはなぜですか?

4

3 に答える 3

4

コレクション初期化子は拡張メソッドを使用しません。Addそのため、。などのメソッドグループを持たないものでコレクション初期化子を使用することはできませんStack<T>。あなたはおそらくそれをサブクラス化することができますが、しないでください

class MyStack<T> : Stack<T> // yeuch
{
    public void Add(T item)
    {
        Push(item);
    }
}
...
// please don't do this... think of the kittens...
Stack<string> stack = new MyStack<string>() { "abc", "demo", "stackoverflow" };
于 2012-08-30T08:54:30.180 に答える
1

ただし、コンパイラは同じエラーを出します。しかし、なぜ?

Stackまだ実装されていないためAdd。省略表記を解析する場合、拡張メソッドは考慮されません。

さらに、ジェネリックスタックはIEnumerable <>を実装していませんか?

します。

スタックにデフォルトでAddメソッドが含まれていないのはなぜですか?

なぜそれが必要ですか?IEnumerableは含まれていませんAdd

于 2012-08-30T08:53:54.573 に答える
1

はいStackはIEnumerable<T>、ICollection、およびIEnumerableを実装していますが、これらのインターフェイスにはAddメソッドがありません。意味的には、追加はプッシュと同じではありません。前者はコレクションの最後にアイテムを追加しますが、プッシュはそれらを「開始」に追加し、より適切にはスタックの一番上に追加します。スタックのAddメソッドを作成するのは混乱しすぎるので、お勧めしません。

于 2012-08-30T08:57:40.283 に答える