与内置类名冲突的用户定义类名-C#

问题描述

我有以下代码,其中我在自己的用户定义的Stack类中使用内置的C#Stack1类。 使用此用户定义的命名法,一切正常。但是,一旦我更改了用户定义的Stack1类的所有引用,并将其称为Stack类,就会使编译器感到困惑,而C#内置了Stack类在我的user defined Stack class内部使用不再与内置Systems.Collections.Stack类相对应。但是,请回到用户定义的StackHavingPopPushAndMinO1_2.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,一切正常。但是,一旦我将Stack1名称更改为Stack,编译器就会感到困惑,并且由于名称冲突而导致错误。对此有任何帮助将大有帮助。为什么C#编译器不知道用户定义的Stack类和内置的Stack类之间的区别?

解决方法

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

您希望它怎么做?当遇到这样的变量声明时:

Stack stack = null;

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

特别是,在上课时,您有:

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

想必,您希望mainStack的类型为System.Collections.Stack,否则您将得到无限递归-但是您希望通过什么规则来确定呢?

您的选择是:

  • 避免命名冲突,这通常是最好的方法
  • 使用别名明确
  • 使用标准名称,例如System.Collections.Stack stack = null;而不只是不合格的名字

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...