Stack is an Abstract Data Type (ADT) and it is supposed to have a sealed list of operations like Push(), Pop(), Peek(),... to enforce Last-In-First-Out (LIFO) Principle.
But it has ElementAt(index) that allows me to access any element in the stack. On my understanding, Stack should have less visibility on the elements which are not in the surface. Isn't it?
Stack is an Abstract Data Type (ADT)
That is true for the general concept of Stack, but System.Collections.Generic.Stack<T>
never promises to be (just) an ADT.
It has to provide the ADT functionality as a minimum (to live up to the name) but is free to offer more.
So it makes no attempt to hide Contains(), Count, TryPeek(), etc.