冲突的用户定义 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.Stack
classes。
代码如下:
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;
而不仅仅是不合格的名称
我有以下代码,我在我自己的用户定义 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.Stack
classes。
代码如下:
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;
而不仅仅是不合格的名称