11

単純なデリゲート呼び出しを想像してみましょう。

void Main()
{
    Func<int, int, string> tfunc = null;
    tfunc += Add; // bind first method
    tfunc += Sub; // bind second method 

    Console.WriteLine(tfunc(2, 2));
}

private string Add(int a, int b)
{
    return "Add: " + (a + b).ToString();
}

private string Sub(int a, int b)
{
    return "Sub: " + (a - b).ToString();
}

このプログラムの結果は次のとおりです。

Sub: 0

では、なぜAddメソッドが呼び出されなかったのでしょうか。メソッドAddを呼び出してから、メソッドSubを呼び出すことを期待しています

4

2 に答える 2

16

Addは正しくチェーンされて呼び出されました、の結果を見てください

void Main()
{
    Func<int, int, string> tfunc = null;
    tfunc += Add; // bind first method
    tfunc += Sub; // bind second method 

    Console.WriteLine(tfunc(2, 2));
}

private string Add(int a, int b)
{
    Console.WriteLine("Inside Add");
    return "Add: " + (a + b).ToString();
}

private string Sub(int a, int b)
{
    Console.WriteLine("Inside Sub");
    return "Sub: " + (a - b).ToString();
}

それは:

Inside Add
Inside Sub
Sub: 0

アクセスする方法がないために連鎖されていないのは、Addメソッドの結果です。チェーンの場合、値を返すデリゲートは、最後に呼び出されたメソッド、つまりデリゲートに追加された最後のメソッドの値を返します。

これは、 C#4.0言語仕様のパート15.4で指定されています

呼び出しリストに複数のエントリが含まれているデリゲートインスタンスの呼び出しは、呼び出しリスト内の各メソッドを順番に同期的に呼び出すことによって進行します。...デリゲートの呼び出しに出力パラメーターまたは戻り値が含まれている場合、それらの最終値は、リスト内の最後のデリゲートの呼び出しから取得されます。

于 2013-01-22T16:34:51.613 に答える
3

問題は、メソッドの呼び出し間で戻り値が渡されないため、出力には最後に返された文字列のみがキャプチャされることです。つまり、Addのリターンは失われます。

于 2013-01-22T16:38:10.923 に答える