雑記 - otherwise

最近はDQ10しかやっていないダメ技術者がちまちまと綴る雑記帳

更続・ nullable な引数を持つメソッドをオーバーロードする場合の解決

実のところ、今までの 3 つの記事で私としては全て解決しているのですが、整理を兼ねて、具体的な例で動きを追ってみようと思います。

class Foo {
  static void Hoge(byte? a) {
    Console.WriteLine("nullable byte");
  }

  static void Hoge(short? a) {
    Console.WriteLine("nullable short");
  }

  static void Hoge(int? a) {
    Console.WriteLine("nullable int");
  }

  // そもそも候補にならないメソッドをさり気なく用意してみる ^^;;
  static void Hoge(long a) {
    Console.WriteLine("long");
  }

  static void Main() {
    Hoge(null);
  }
}

まず、コンパイラは Hoge(null) と云うコードに対して、対象となるメソッド(関数)を探します。
この場合、 null を引数に取れるのは、 Hoge(byte?) , Hoge(short?) , Hoge(int?) の 3 つになります。(「適切な関数メンバ」の検索)
次に、この候補の中で「より適切な」ものを探します。
それぞれのパラメータを見ると、 byte? , short? , int? です。
ここで、「 6.1.4 暗黙の null 許容変換」から、 nullable な型同士の型変換には、それぞれの non-nullable な型同士の型変換と同じ規則が採用されるので、ここでは byte , short , int について考えればよい事になります。
そして byte , short , int については「 7.4.3.2 より適切な関数メンバ」によって、最も限定的な型である byte が適切と判断されます。(オーバーロードの解決)
※この際、「より適切な関数メンバ」を探すにあたって元の引数「 null 」が一切関与しない事が重要です。
よって、結果として「 Hoge(byte?) 」が呼び出されます。