2

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

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

当尝试像这样创建堆栈的新实例时,它不会工作。

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

编译器说 Stack<> 没有 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 方法。从语义上讲,添加与推送不同;前者将项目添加到集合的末尾,而 push 将它们添加到“开始”,更合适地位于堆栈顶部。为堆栈创建 Add 方法会太混乱,我不推荐它。

于 2012-08-30T08:57:40.283 回答