More on full qualification, this time in C#

More on full qualification, this time in C#

  • Comments 4

We were speaking earlier about how to resolve ambiguous enumerated type names in VBScript. Here’s a related C# question I got recently:

namespace Alpha.Bravo.Charlie {
  public class Romeo {}
}
namespace Zulu.Alpha.Bravo {
  public class Tango {}
}
namespace Zulu.Alpha.Bravo.Charlie {
  public class Sierra {
    Alpha.Bravo.Charlie.Romeo xray;
    // Above line fails, even though it is fully qualified.
    Alpha.Bravo.Tango yankee;      
    // Above line works even though Alpha.Bravo has no such type.
 
}
}

What the heck is up with that? VBScript was designed to get this right when fully qualified, so why doesn’t C# get it right?

The reason is because the namespace statement doesn’t do what you think it does.  The above program is syntactic sugar for this program:

namespace Alpha {
  namespace Bravo {
    namespace Charlie {
      public class Romeo {}
    }
  }
}
namespace Zulu {
  namespace Alpha {
    namespace Bravo {
      public class Tango {}
      namespace Charlie {
        public class Sierra {
          Alpha.Bravo.Charlie.Romeo xray; 
          Alpha.Bravo.Tango yankee;
        }
      }
    }
  }
}

And now it is clear why the first fails and the second succeeds.  C# binds Alpha by searching up the scope chain until it finds a match, and it finds one before it gets to the global Alpha.

This is a rather unfortunate situation. To guarantee that you reallio trulio fully qualify a type in this situation, you can do this in C# v2.0:

global::Alpha.Bravo.Charlie.Romeo xray;  

 

  • Dude, I think you just BLEW MY MIND! Awesome!
  • Is this a new feature? My C# language spec. says of its Hello World program, "the '::' is not an operator at all".

    And it doesn't seem to work in VS2003.
  • Sorry, I should have clarified that this is a new feature.
Page 1 of 1 (4 items)