假设我们有一个这样的通用列表:
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方法?
答案 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方法会让人感到困惑,我不推荐它。