連載:[完全版]究極のC#プログラミング

Chapter10 名前空間のエイリアス修飾子と外部アセンブリ

川俣 晶
2009/12/14
Page1 Page2 Page3

10.2 グローバルな名前空間の強制

 ここまで見てきた使い方とは別に、名前空間エイリアス修飾子には、グローバルな名前空間を強制する使い方もある。これを用いないとうまくコンパイルできないケースがあるので、価値は大きい。実際に、コンパイルできないソースコードがこれによってコンパイル可能になる事例を見てみよう。

 次のリスト10.3は、コンパイルできない例である。

using System;

namespace A.B
{
  public class C
  {
    public static void SayHello()
    {
      Console.WriteLine("Hello!");
    }
  }
}

namespace Sample.A.B
{
  class C
  {
  }
}

namespace Sample.Main
{
  class Program
  {
    static void Main(string[] args)
    {
      A.B.C.SayHello();
      // 次のようなコンパイルエラーとなる
      // 'Sample.A.B.C' に 'SayHello' の定義がありません。
    }
  }
}
リスト10.3 コンパイルできない例

 コードを書いた側は、最上位の名前空間からすべて書いたのだからA.B.C.SayHello()は見つかるはずだと思うかもしれない。しかし、実際にはA.B.C.SayHello()はSample.A.B.C.SayHello()の省略形だとコンパイラに見なされてしまい、メソッドが見つからないというエラーになっている。

 これを解消するには、「global::」を補えばよい。

// リスト10.3のコード
A.B.C.SayHello();

// 「global::」を使用
global::A.B.C.SayHello(); // 出力:Hello!
グローバル名前空間から解釈することを強制する「global::」を使う

 「::」の手前のglobalは、その名前をグローバル名前空間(最上位の名前空間)から解釈することを強制する。これによって、紛らわしい名前空間名として解釈されることを防止できる。


 INDEX
  [完全版]究極のC#プログラミング
  Chapter10 名前空間のエイリアス修飾子と外部アセンブリ
    1.10.1 バージョンによるコード破壊
  2.10.2 グローバルな名前空間の強制
    3.10.3 アセンブリ間の名前競合の解決/練習問題
 
インデックス・ページヘ  「[完全版]究極のC#プログラミング」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間