2005年C#の旅その3

C#名前空間を使う場合に、同じ名前の名前空間を使うと同名の名前空間を隠してしまう問題がありましたがC#2.0ではglobal::が導入されて回避出来るようになりました。以下、サンプル。

namespace MyNamespace {
    namespace System
    {
        class MyClass
        {
        }
    }

    namespace Executable 
    {
        class Program
        {
            public static void Main()
            {
                // Executable名前空間内にSystemが見つからないので、
                // MyNamespace名前空間を探すとSystem名前空間が見つかる
                // しかし、MyNamespace.System.Consoleは見つからないので次の行はコンパイルエラー
                // System.Console.WriteLine("Hello");

                // global::を使うとグローバルレベルから名前空間/型を探す
                global::System.Console.WriteLine("Hello");
            }
        }
    }
}

昔、自前ライブラリを作っているときにMyLib.System名前空間みたいなのを作って嵌った経験があるので、ちょっと嬉しいかも。