gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 17:01:11 25 4
gpt4 key购买 nike

我有以下代码,我在其中使用内置的 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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com