0

我有以下代码,我Stack在自己的用户定义类中使用内置的 C#Stack1类。一切都适用于这个用户定义的命名法。但是,一旦我更改了用户定义Stack1类的所有引用并将其作为Stack类调用 - 编译器就会感到困惑,并且Stack我在其中使用的 C# 内置类user defined Stack class不再对应于内置Systems.Collections.Stack类。但是,回退到用户定义的StackHavingPopPushAndMinO1_2.Stack类。你知道为什么会这样吗,有什么办法可以让我的用户定义的 Stack 类名保持不变,Stack并且仍然使用其中的内置Systems.Collections.Stack类吗?

请参阅:我已经通过使用System.Collections.Generic.Stack<int>我的用户定义Stack类中的类解决了这个问题。但我的意图是我不想更改我的用户定义Stack类的名称 - 并且仍然使用其中的内置Systems.Collection.Stack类。

请参阅:我还创建了一个别名System.Collections并将其附加到Stack我正在使用的内置类中。但我只是想知道是否有其他方法可以使用我的用户定义Stack类,其中包含内置Systems.Collections.Stack类。

以下是代码:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace StackHavingPopPushAndMinO1_2
{
    class Stack1
    {
        Stack mainStack = new Stack();
        Stack supportingStack = new Stack();

        public void Push(int value)
        {
            mainStack.Push(value);
            if(supportingStack.Count==0 || value <= (int) supportingStack.Peek())
            {
                supportingStack.Push(value);
            }
        }

        public int Pop()
        {
            int value = -1;
            if(mainStack.Count>0)
            {
                value = (int) mainStack.Pop();
                if (value == (int) supportingStack.Peek())
                    supportingStack.Pop();
            }
            return value;
        }

        public int Min()
        {
            if (supportingStack.Count > 0)
                return (int) supportingStack.Peek();
            return -1;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Stack1 stack = new Stack1();
            stack.Push(60);
            stack.Push(10);
            stack.Push(50);
            Console.WriteLine(stack.Min());
            stack.Push(80);
            stack.Push(9);
            stack.Push(11);
            Console.WriteLine(stack.Min());
        }
    }
}

用户定义的类一切正常Stack1。但是,一旦我将名称更改为Stack1to Stack,编译器就会感到困惑,并且由于名称冲突而出现错误。对此的任何启示都将非常有帮助。为什么 C# 编译器不知道用户定义Stack类和内置Stack类之间的区别?

4

1 回答 1

1

为什么 C# 编译器不知道用户定义的 Stack 类和内置的 Stack 类之间的区别?

您希望它如何做到这一点?当它遇到这样的变量声明时:

Stack stack = null;

...应该指哪个类?我怀疑在某些情况下您希望它引用StackHavingPopPushAndMinO1_2.Stack,而在其他情况下您希望它引用System.Collections.Stack. C# 编译器遵循非常严格的名称查找规则来确定名称的含义。您可以在 C# 规范中找到这些规则,我怀疑您很难设计更好的规则。

特别是,看看你的班级,你有:

class Stack // After renaming
{
    Stack mainStack = new Stack();
    ...

大概,您希望的类型为mainStackSystem.Collections.Stack否则您将得到无限递归 - 但您希望用什么规则来确定呢?

您的选择是:

  • 避免命名冲突,这通常是最好的方法
  • 使用别名明确
  • 使用完全限定名称,例如,System.Collections.Stack stack = null;而不仅仅是不限定名称
于 2020-10-02T07:16:12.637 回答