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