向通用堆栈添加方法的问题?

时间:2012-08-30 08:49:45

标签: c# generics stack extension-methods

假设我们有一个这样的通用列表:

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

当尝试像这样创建一个新的堆栈实例时,它将无法工作。

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

编译器说Stack&lt;&gt;没有添加方法。所以我使用extensionmethods实现了一个add方法:

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

但是,编译器仍会给出相同的错误。但为什么?编译器现在不应该找到该方法吗?此外,通用堆栈实现不是IEnumerable&lt;&gt;和ICollection&lt;&gt;?为什么堆栈默认不包含Add方法?

3 个答案:

答案 0 :(得分: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" };

答案 1 :(得分:1)

  

但是,编译器仍会给出相同的错误。但为什么呢?

因为Stack仍未实施Add。解析速记符号时不考虑扩展方法。

  

此外,通用堆栈是否实现IEnumerable&lt;&gt;?

确实如此。

  

为什么堆栈默认不包含Add方法?

为什么要这样? IEnumerable不包含Add

答案 2 :(得分:1)

是Stack实现IEnumerable&lt; T&gt;,ICollection和IEnumerable,但这些接口都没有Add方法。在语义上,添加与推送不同;前者将项添加到集合的末尾,而push将它们添加到“开头”,更恰当地在堆栈顶部。为堆栈创建Add方法会让人感到困惑,我不推荐它。