C#メソッドのオーバーロードされたバージョンが2つあるとします。
void Method( TypeA a ) { }
void Method( TypeB b ) { }
私は次のようにメソッドを呼び出します:
Method( null );
メソッドのどのオーバーロードが呼び出されますか?特定のオーバーロードが呼び出されるようにするにはどうすればよいですか?
C#メソッドのオーバーロードされたバージョンが2つあるとします。
void Method( TypeA a ) { }
void Method( TypeB b ) { }
私は次のようにメソッドを呼び出します:
Method( null );
メソッドのどのオーバーロードが呼び出されますか?特定のオーバーロードが呼び出されるようにするにはどうすればよいですか?
とに依存しTypeA
ますTypeB
。
null
への変換はありません)、該当するものが呼び出されます。TypeB
TypeA
TypeA
それ以外の場合は、との間の関係に依存しTypeB
ます。
TypeA
へTypeB
の暗黙の変換がない場合は、を使用TypeB
しTypeA
たオーバーロードTypeA
が使用されます。TypeB
へTypeA
の暗黙の変換がない場合は、を使用TypeA
しTypeB
たオーバーロードTypeB
が使用されます。詳細なルールについては、C#3.0仕様のセクション7.4.3.4を参照してください。
これは、あいまいでない例です。ここでTypeB
は、から派生しています。つまり、からへTypeA
の暗黙の変換がありますが、その逆はありません。したがって、を使用した過負荷が使用されます。TypeB
TypeA
TypeB
using System;
class TypeA {}
class TypeB : TypeA {}
class Program
{
static void Foo(TypeA x)
{
Console.WriteLine("Foo(TypeA)");
}
static void Foo(TypeB x)
{
Console.WriteLine("Foo(TypeB)");
}
static void Main()
{
Foo(null); // Prints Foo(TypeB)
}
}
一般に、他の点ではあいまいな呼び出しが発生した場合でも、特定のオーバーロードが使用されるようにするには、次のようにキャストします。
Foo((TypeA) null);
また
Foo((TypeB) null);
これが宣言クラスの継承を伴う場合(つまり、1つのクラスがその基本クラスによって宣言されたメソッドをオーバーロードしている場合)、他の問題が発生し、引数ではなくメソッドのターゲットをキャストする必要があることに注意してください。
Jon Skeet は、既定でどのオーバーロードが選択されるかについて既に回答していますが、特定のオーバーロードが確実に呼び出されるようにしたい場合は、キャストよりも名前付きパラメーターを使用する方がよい場合がよくあります。
あなたが持っている場合:
void Method( TypeA a ) { }
void Method( TypeB b ) { }
電話Method(a: null);
するか、Method(b: null);
あいまいな呼び出し。(コンパイル時エラー)。