Scope-resolution operator :: versus member-access operator . in C#

前端 未结 2 635
忘了有多久
忘了有多久 2021-01-18 02:58

In C#, what\'s the difference between A::B and A.B? The only difference I\'ve noticed is that only :: can be used with global

相关标签:
2条回答
  • 2021-01-18 03:33

    with :: you can do things like...

     extern alias X;
     extern alias Y;
     class Test
     {
       X::N.A a;
       X::N.B b1;
       Y::N.B b2;
       Y::N.C c;
     }
    

    and there are times when . is ambiguous so :: is needed. here's the example from the C# language spec

    namespace N
    {
       public class A {}
       public class B {}
    }
    namespace N
    {
       using A = System.IO;
       class X
       {
          A.Stream s1;         // Error, A is ambiguous
          A::Stream s2;        // Ok
       }
    }
    

    http://download.microsoft.com/download/0/B/D/0BDA894F-2CCD-4C2C-B5A7-4EB1171962E5/CSharp%20Language%20Specification.htm

    0 讨论(0)
  • 2021-01-18 03:48

    the :: operator only works with aliases global is a special system provided alias.

    so ... this works:

    using Foo = System.ComponentModel;
    
    public MyClass {
    
      private Foo::SomeClassFromSystemComponentModel X;
    
    }
    

    but not this:

    public MyClass {
    
      private System.ComponentModel::SomeClassFromSystemComponentModel X;
    
    }
    

    This lets you escape from the hell of sub namespaces that can come about when you are integrating with a library where they have:

    namespace MyAwesomeProduct.System
    {
    
    }
    

    And you in you code have

    using MyAwesomeProduct;
    

    global:: lets you find the real System.

    MSDN info here

    0 讨论(0)
提交回复
热议问题