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

雑記 - otherwise

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

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

C#

どうやらこれは、「プリミティブ型が特別」なのではなくて、「双方の型変換順位が明確かどうか」が鍵の様です。
例えば、↓こんなのを試すと、コンパイルエラーにならず、実行するとちゃんと「 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 とか)を混在させるとコンパイルエラーになりますし。