如何解决与内置类名冲突的用户定义类名-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;
而不只是不合格的名字
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。