追考・ nullable な引数を持つメソッドをオーバーロードする場合の解決
先の記事でちょいと壮大な解釈ミスがあったので訂正記事を書かせていただきます。。。
ミスっていたのは数値リテラルに対する解釈です。なので、影響するのは (1), (2), (3), (7) になります。
この 4 件について、改めて以下に記載します。
(1) int vs short
static void Main() { Hoge(0); } static void Hoge(int a) { Console.WriteLine("int"); } static void Hoge(short a) { Console.WriteLine("short"); } // [output] // int
引数として渡されている "0" は整数リテラルなので int と判断されます。 (2.4.4.2)
ここで引数の int とパラメータの int で恒等変換が成立するため、 int 側のメソッドが呼ばれます。 (6.1.1 / 7.5.3.4)
(2) int vs int?
static void Main() { Hoge(0); } static void Hoge(int a) { Console.WriteLine("int"); } static void Hoge(int? a) { Console.WriteLine("int?"); } // [output] // int
(1) と同じです。
(3) int vs short?
static void Main() { Hoge(0); } static void Hoge(int a) { Console.WriteLine("int"); } static void Hoge(short? a) { Console.WriteLine("short?"); } // [output] // int
これも (1) と同じです。
# この例、実は例自体に誤りがあったと云う。。。
# 本当は↓の検証を載せる予定でした><
(3)' int? vs short
static void Main() { Hoge(0); } static void Hoge(int? a) { Console.WriteLine("int?"); } static void Hoge(short a) { Console.WriteLine("short"); } // [output] // short
引数として渡されている "0" は整数リテラルなので int と判断されます。 (2.4.4.2)
null 許容型は同じ型の null 非許容型と同等の暗黙変換を使用可能です。 (6.1.5)
ここで、 int より short の方がより限定的なので short 側のメソッドが呼ばれます。 (6.5.3.5)
(7) int vs dynamic
static void Main() { Hoge(0); } static void Hoge(int a) { Console.WriteLine("int"); } static void Hoge(dynamic a) { Console.WriteLine("dynamic"); } // [output] // int
この例も (1) と同じになります。