为什么解析命名空间冲突需要双冒号(::)运算符?

时间:2013-03-04 16:27:43

标签: c# .net namespaces

请参阅下面的示例程序。我有两个名称空间包含相同的struct。为了避免在Main()中使用时发生冲突,我给出了名称空间别名。从struct调用Main()时,我可以直接通过命名空间别名调用,例如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();
    }
}

2 个答案:

答案 0 :(得分:5)

当有人在不考虑使用代码的情况下编写代码时,主要需要它。即名称空间中的重复类,它们应该一起使用或隐藏名称空间。

MSDN示例在Use the Global Namespace Alias中显示了一个案例:

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

    }
}

答案 1 :(得分:3)

::运算符执行相同操作namespace. ,但::运算符用于查找标识符。它始终位于两个标识符之间

示例:

global::System.Console.WriteLine("Hello World");

这里解释的一个好例子:http://msdn.microsoft.com/en-us/library/c3ay4x3d.aspx