C# 为什么需要双冒号(:)运算符来解决名称空间冲突?
请看我下面的示例程序。我有两个名称空间包含相同的C# 为什么需要双冒号(:)运算符来解决名称空间冲突?,c#,.net,namespaces,C#,.net,Namespaces,请看我下面的示例程序。我有两个名称空间包含相同的struct。为了避免在Main()中使用时发生冲突,我给了名称空间别名。从Main()调用struct时,我可以通过名称空间别名直接调用,如test.MyStruct。我还有另一个选择,也可以使用:操作符,比如test::MyStruct 为什么需要使用:操作符,我应该在哪里使用它而不是别名 using System; using test=counter; using duplicatecounter; namespace counter {
struct
。为了避免在Main()
中使用时发生冲突,我给了名称空间别名。从Main()
调用struct
时,我可以通过名称空间别名直接调用,如test.MyStruct
。我还有另一个选择,也可以使用:
操作符,比如test::MyStruct
为什么需要使用:
操作符,我应该在哪里使用它而不是别名
using System;
using test=counter;
using duplicatecounter;
namespace counter
{
struct MyStruct
{
}
}
namespace duplicatecounter
{
struct MyStruct
{
}
}
class Program
{
public static void Main()
{
test.MyStruct a = new test.MyStruct();
test::MyStruct a1 = new test::MyStruct();
}
}
:
操作符执行与命名空间相同的操作。
,但使用:
运算符查找标识符。它总是位于两个标识符之间
例如:
global::System.Console.WriteLine("Hello World");
这里解释了一个很好的例子:当有人编写代码而不考虑正在使用的代码时,主要需要它。即,名称空间中的重复类预期一起使用或隐藏名称空间 MSDN示例显示了以下一种情况:
另外,这里的问题更多的是为什么在
namespace.type
表单上使用namespace::type
操作符。我试图在这里找出不同之处。迪帕克——这是一个合理的问题,但这里的提问方式并没有很清楚地说明这一点。如果你还想知道,我建议你问一个新问题,明确地说“有什么不同”或者“什么时候使用一个而不是另一个”。我不建议使用名称空间别名,因为它们只是混淆了问题。太好了。现在我明白了global::
表单没有像global那样的别名版本。
。回答得好,伊斯拉姆。无论如何,标识符在您的示例中是什么意思?我对推理感到困惑。好吧,我能用global=System做这个;类TestApp{static void Main(){global.Console.WriteLine(“test”);}}
但是很好,我得到了答案..感谢Alexei的详细解释。实际上,除了全局名称之外,任何别名空间都不需要它。如果使用任何其他别名,则可以使用常规的c#点语法(即SomeAliasedAssembly.Namespace.Class.等)
class TestApp
{
// Define a new class called 'System' to cause problems.
public class System { }
// Define a constant called 'Console' to cause more problems.
const int Console = 7;
const int number = 66;
static void Main()
{
// The following line causes an error. It accesses TestApp.Console,
// which is a constant.
//Console.WriteLine(number);
global::System.Console.WriteLine(number); // ok
}
}