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

Conflicting user defined class name with inbuilt class name - C#

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

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

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

代码如下:

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());
        }
    }
}

用户定义的 class Stack1 一切正常。但是,一旦我将 Stack1 的名称更改为 Stack,编译器就会混淆,并且我们会因名称冲突而出错。对此的任何了解都会大有帮助。为什么 C# 编译器不知道用户定义的 Stack class 和内置的 Stack class 之间的区别?

Why does not the C# Compiler know the difference between the user defined Stack class, and the inbuilt Stack class?

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

Stack stack = null;

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

特别是,查看您的 class,您有:

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

据推测,您希望 mainStack 的类型为 System.Collections.Stack,否则您将以无限递归告终 - 但您希望用什么规则来确定它?

您的选择是:

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