Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么需要双冒号(:)运算符来解决名称空间冲突?_C#_.net_Namespaces - Fatal编程技术网

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

    }
}