過負荷の解決

# 基本的なオーバーロードの例

このコードには、Hello という名前のオーバーロードされたメソッドが含まれています :

class Example
{
    public static void Hello(int arg)
    {
        Console.WriteLine("int");
    }
 
    public static void Hello(double arg)
    {
        Console.WriteLine("double");
    }
 
    public static void Main(string[] args) 
    {
        Hello(0);
        Hello(0.0);
    }
}

メイン メソッドが呼び出され、印刷されます

int
double

コンパイル時に、コンパイラがメソッド呼び出し Hello(0) を見つけたとき 、名前が Hello のすべてのメソッドを検索します .この場合、それらのうちの 2 つが見つかります。次に、どちらの方法が優れているかを判断しようとします .どちらの方法が優れているかを判断するためのアルゴリズムは複雑ですが、通常は「暗黙的な変換をできるだけ少なくする」ことになります。

したがって、Hello(0) の場合 、メソッド Hello(int) の変換は必要ありません ただし、メソッド Hello(double) には暗黙的な数値変換が必要です .したがって、最初の方法がコンパイラによって選択されます。

Hello(0.0)の場合 、0.0 を変換する方法がありません int に 暗黙的に、メソッド Hello(int) オーバーロードの解決についても考慮されていません。メソッドのみが残っているため、コンパイラによって選択されます。

# "params" は、必要でない限り展開されません。

次のプログラム:

class Program
{
    static void Method(params Object[] objects)
    {
        System.Console.WriteLine(objects.Length);
    }   
    static void Method(Object a, Object b)
    {
        System.Console.WriteLine("two");
    }
    static void Main(string[] args)
    {
        object[] objectArray = new object[5];

        Method(objectArray);
        Method(objectArray, objectArray);
        Method(objectArray, objectArray, objectArray);
    }
}

印刷されます:

5
two
3

呼び出し式 Method(objectArray) 2 つの方法で解釈できます:単一の Object たまたま配列である引数 (したがって、プログラムは 1 を出力します) メソッド Method キーワード params がありませんでした .このような状況では、通常の展開されていない形式が常に優先されます。したがって、プログラムは 5 を出力します .

2 番目の式では、Method(objectArray, objectArray) 、最初の方法の拡張形式と従来の2番目の方法の両方が適用可能です。この場合も、展開されていないフォームが優先されるため、プログラムは two を出力します。 .

3 番目の式では、Method(objectArray, objectArray, objectArray) 、唯一のオプションは、最初のメソッドの展開された形式を使用することです。そのため、プログラムは 3 を出力します .

# 引数の 1 つとして null を渡す

持っている場合

void F1(MyType1 x) {
    // do something
}

void F1(MyType2 x) {
    // do something else
}

何らかの理由で、F1 の最初のオーバーロードを呼び出す必要があります しかし x = null で 、その後は単純に

F1(null);

呼び出しがあいまいであるため、コンパイルされません。これに対抗するには

F1(null as MyType1);

# コメント

オーバーロード解決のプロセスは、C# 仕様のセクション 7.5.3 で説明されています。また、セクション 7.5.2 (型推論) と 7.6.5 (呼び出し式) も関連しています。

オーバーロード解決の仕組みは、C# 7 で変更される可能性があります。デザイン ノートは、Microsoft が (複雑なシナリオで) どちらの方法が優れているかを判断するための新しいシステムを展開することを示しています。