読者です 読者をやめる 読者になる 読者になる

雑記 - otherwise

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

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

C#

先の記事でちょいと壮大な解釈ミスがあったので訂正記事を書かせていただきます。。。
ミスっていたのは数値リテラルに対する解釈です。なので、影響するのは (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) と同じになります。