サーチ…


備考

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

どのように過負荷の解決作業がC#7でおそらく変更されるでしょうか?設計ノートは、Microsoftがどの方法が(複雑なシナリオで)良いかを決定するための新しいシステムを展開することを示しています。

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

このコードには、 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);
    }
}

Mainメソッドが呼び出されると、それは印刷されます

int
double

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

したがって、の場合にHello(0)変換は方法のために必要とされないHello(int)が、暗黙的な数値変換は、方法のために必要とされるHello(double) 。したがって、最初の方法はコンパイラによって選択されます。

Hello(0.0)の場合、 0.0int暗黙的に変換する方法はないため、 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つの方法で解釈できますMethod(objectArray)つの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);


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow