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

标签 c# namespaces name-collision name-conflict

我有以下代码,我在其中使用内置的 C# Stack我自己用户定义的类 Stack1类(class)。
一切都适用于这个用户定义的命名法。但是,一旦我更改了用户定义的所有引用 Stack1类,并将其称为 Stack类 - 编译器被混淆,C# 内置 Stack我在 user defined Stack class 中使用的类不再对应内置Systems.Collections.Stack类(class)。但是,回退到用户定义的 StackHavingPopPushAndMinO1_2.Stack类(class)。
你知道为什么会这样吗,有什么办法可以让我的用户定义的 Stack 类名保持为 Stack并且仍然使用内置的 Systems.Collections.Stack课里面呢?
请参阅:我已经使用 System.Collections.Generic.Stack<int> 解决了这个问题我的用户定义中的类 Stack类(class)。但我的意图是我不想更改用户定义的名称 Stack类 - 仍然使用内置的 Systems.Collection.Stack里面的类。
请参阅:我还为 System.Collections 创建了一个别名并将其附加到 inbuild Stack我正在使用的类(class)。但我只是想知道是否还有其他方法可以使用我的用户定义 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类(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# 规范中找到这些规则,我怀疑您很难设计出更好的规则。
特别是,看看你的类(class),你有:
class Stack // After renaming
{
    Stack mainStack = new Stack();
    ...
大概,您想要 mainStack 的类型成为 System.Collections.Stack ,否则你最终会得到无限递归——但是你希望用什么规则来确定它?
您的选择是:
  • 避免命名冲突,这通常是最好的方法
  • 使用别名显式
  • 使用完全限定的名称,例如System.Collections.Stack stack = null;而不仅仅是不合格的名称
  • 关于c# - 用户定义的类名与内置类名冲突 - C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64167457/

    相关文章:

    c# - 在 C# 中使用网络摄像头

    c# - 为什么 ef 中的身份号码会跳到一个大数字?

    php - 如何在 codeigniter 中使用 composer 包?

    python - 第三方模块中导入的模块之间的名称冲突

    c# - 如何在 C# 中将时区作为字符串获取?

    c# - 设置给定位数的整数到字节

    php - 类是否只能对其命名空间可见

    php - 如何调用另一个命名空间中的方法

    java - 逐行解析 2 个文件并需要避免重复(在特殊情况下)

    vba - 如何将 ActiveX 控件复制到另一个工作表以防止控件名称更改