nullable な引数を持つメソッドをオーバーロードする場合の解決
- nullableの引数を持つメソッドをオーバーロードする場合に、引数にnullを与えた時にコンパイルエラーにならない。 (The road to C# master trapemiya)
- null 許容型の不思議 (R.Tanaka.Ichiro's Blog)
どうやらこれは、「プリミティブ型が特別」なのではなくて、「双方の型変換順位が明確かどうか」が鍵の様です。
例えば、↓こんなのを試すと、コンパイルエラーにならず、実行するとちゃんと「 A 」が出力されます。
struct A { // A → B へは暗黙的変換を許可 public static implicit operator B(A obj) { return new B(); // とりあえず変換はテキトーに } } struct B { // B → A へは明示的な変換が必要 public static explicit operator A(B obj) { return new A(); // 変換はテキトーに } } class Foo { static void Hoge(A? obj) { Console.WriteLine("A"); } static void Hoge(B? obj) { Console.WriteLine("B"); } static void Main() { Hoge(null); // "A" と出力される } }
この例で、例えば B → A への変換を暗黙的 (implicit) にすると、コンパイルエラー(次のメソッドまたはプロパティ間で呼び出しが不適切です)となります。
プリミティブ型の場合、この順位がはっきりしているのでコンパイルエラーにならないってことではないでしょうか。
# 実際、プリミティブ型でも型変換が暗黙的に行えないもの( uint とか decimal とか)を混在させるとコンパイルエラーになりますし。