向泛型堆栈添加方法时出现问题



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

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方法?

集合初始化程序不使用扩展方法;因此,不能将集合初始值设定项与没有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" };

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

因为CCD_ 3仍然没有实现CCD_。解析简写符号时不考虑扩展方法。

此外,通用堆栈不实现IEnumerable<>吗?

确实如此。

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

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

Yes Stack实现IEnumerable<T>,ICollection和IEnumerable,但这些接口都没有Add方法。从语义上讲,添加与推送不同;前者将项目添加到集合的末尾,而push将它们添加到"开头",更确切地说是添加到堆栈的顶部。为堆栈创建Add方法太令人困惑了,我不建议这样做。

最新更新