假设我们有这样一个通用列表:
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方法太令人困惑了,我不建议这样做。