为什么::-运算符与全局关键字而不是点运算符关联? 来自C++背景的我自己,习惯C语言需要一定的时间。在C#中,使用点运算符(.)访问命名空间和类作用域的频率比使用::-运算符(C#中的命名空间限定符运算符)更高 C++中,使用点运算符()来访问类的实例成员。另一方面,作用域解析运算符(::)用于访问没有该类实例的类的成员。对我来说,这是有道理的,而且是合乎逻辑和一致的

为什么::-运算符与全局关键字而不是点运算符关联? 来自C++背景的我自己,习惯C语言需要一定的时间。在C#中,使用点运算符(.)访问命名空间和类作用域的频率比使用::-运算符(C#中的命名空间限定符运算符)更高 C++中,使用点运算符()来访问类的实例成员。另一方面,作用域解析运算符(::)用于访问没有该类实例的类的成员。对我来说,这是有道理的,而且是合乎逻辑和一致的,c#,namespaces,global,operator-keyword,C#,Namespaces,Global,Operator Keyword,虽然我可以接受C#中使用的不同方法,但似乎至少有一个例子,我看到了不一致。至少在我看来是这样的。它与全局关键字有关: global::System.Console.WriteLine("Hello World"); 有人能给我解释一下为什么名称空间别名限定符需要与全局关键字而不是点运算符一起使用吗?这并不常见,但在某些情况下,它很方便 假设您在当前名称空间中有一个类System: namespace Test { static class System { public

虽然我可以接受C#中使用的不同方法,但似乎至少有一个例子,我看到了不一致。至少在我看来是这样的。它与全局关键字有关:

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

有人能给我解释一下为什么名称空间别名限定符需要与全局关键字而不是点运算符一起使用吗?

这并不常见,但在某些情况下,它很方便

假设您在当前名称空间中有一个类
System

namespace Test {
    static class System {
        public static Do() { }
    }

    class Foo {
        void foo() {
            System.Do(); // What's this?
        }
    }
}
你想让事情变得更复杂吗?在
系统中添加一个内部类
并调用它,例如,
操作
。当然,这些都是边缘情况,您可能永远不需要使用
global::
,但语言本身必须处理这种情况。有关更多示例,请参见

全局名称空间别名在另一种情况下也很有用:当引用两个DLL时,它们具有相同的名称空间和类(例如,因为它们只是相同内容的两个版本)。那样的话,你怎么能引用它们呢?一样。您可以更改名称空间以包含版本号,但每次更改名称空间(VS automatic refactoring AFAIK不适用于名称空间)时都会很麻烦,或者您可以使用两个别名引用它们。它们将被访问,例如,如下所示:

Version1::CompanyName.MyNamespace.MyClass
Version2::CompanyName.MyNamespace.MyClass
还请注意,当您生成代码(例如,所有设计器生成的代码)时,这是一种很好的做法(包括
global::
名称空间),因为您不知道代码将在哪种情况下编译(然后可能会发生冲突)



关于
::
的推理好吧……这不是一个关于SO的问题(除非你很幸运Eric在这里玩得很开心),但我可能猜这是因为它们是不同的东西。如果使用了相同的运算符
,那么解析器如何理解
global.System
您希望使用全局命名空间别名,而不是名为
global
的类或命名空间?他们必须使<代码>全局<代码>一个保留关键字,它不能解决冲突层次结构的其他问题…

,因为<代码>全局<代码>是一个命名空间别名(实际上是匿名的)全局命名空间,而不是本身的命名空间。总是把C和C++之间的相似性当作意外而不是设计目标。它的几率与C++中引起的麻烦数量成反比。这是一个很大的问题,C++中的名字解析是非常复杂的。微软C++编译器今天仍然存在主要错误。当然,任何创建自己的类“Stand”的人都需要检查他们的头部。如果您发现需要使用“global::”,那么您可能做错了什么。@DaveDoknjas绝对正确!这有点糟糕,因为同样的考虑也适用于属性、内部类和字段,但是的……非常罕见。