更続・ nullable な引数を持つメソッドをオーバーロードする場合の解決
- nullableの引数を持つメソッドをオーバーロードする場合に、引数にnullを与えた時にコンパイルエラーにならない。 (The road to C# master trapemiya)
- nullable な引数を持つメソッドをオーバーロードする場合の解決
- 続・ nullable な引数を持つメソッドをオーバーロードする場合の解決
- 続続・ 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?) 」が呼び出されます。