索引自定义堆栈 Class

Indexing a custom Stack Class

我目前正在使用 Udemy 课程进行一些 C# 单元测试。本课程中实现了当前Stackclass:

namespace Testing
{
    public class Stack<T>
    {
        public readonly List<T> _list = new List<T>();
        
        public int Count => _list.Count;

        public void Push(T obj)
        {
            if (obj == null)
                throw new ArgumentNullException();
            
            _list.Add(obj);
        }

        public T Pop()
        {
            if (_list.Count == 0)
                throw new InvalidOperationException();

            var result = _list[_list.Count - 1];
            _list.RemoveAt(_list.Count - 1);

            return result; 
        }


        public T Peek()
        {
            if (_list.Count == 0)
                throw new InvalidOperationException();

            return _list[_list.Count - 1];
        }
    }
}

现在,我不明白为什么Peek函数可以使用:

return _list[_list.Count - 1];

据我所知,如果未明确实现此类功能(此处似乎并非如此),则无法为列表对象编制索引。此外,如果我创建该对象的实例:

Stack<int> newStack = new Stack<int>();
newStack.Push(5);
var lastElement = newStack[0];

我收到一条波浪形的错误消息:

cannot apply indexing with to an expression of 'Testing.Stack<int>'

...这支持我无法为该实例编制索引的假设。有人可以向我解释一下这种行为吗?

As far as I know, A List object cannot be indexed

这是不正确的。 C# 列表是 dynamic array, similar to the c++ std::vector. You are probably thinking of linked list 的一种类型,一种完全不同的类型,我很少推荐使用它。

cannot apply indexing with to an expression of 'Testing.Stack'

这是因为您还没有实施indexer。假设您希望零成为最近添加的项目:

public T this[int i] => _list[Count  - i - 1];

虽然编写自己的堆栈作为练习很有用,但对于实际工作,我建议使用内置的 stack. There is also source code available