通常戻り値をもつようなイベントハンドラを定義することはほとんどないかと思いますが、実際に戻り値を持つイベントハンドラを定義し、複数のメソッドを呼び出すようにした場合、戻り値がどのようになるかを調べてみました。
using System;
using System.Collections.Generic;
using System.Text;
namespace Delegate戻り値複数コール
{
class Program
{
static void Main(string[] args)
{
ClassA classA = new ClassA();
classA.CallEvent += delegate(object sender, EventArgs args1)
{
Console.WriteLine("1番目のコール「1」を返します。");
return 1;
};
classA.CallEvent += delegate(object sender, EventArgs args2)
{
Console.WriteLine("2番目のコール「2」を返します。");
return 2;
};
Console.WriteLine("「" + classA.CallMethod().ToString() + "」が返りました。");
}
}
class ClassA
{
public delegate int EventHandler(object sender, EventArgs args);
public event EventHandler CallEvent = null;
public int CallMethod()
{
return CallEvent(this, null);
}
}
}
下が実行した結果です。
1番目のコール「1」を返します。
2番目のコール「2」を返します。
「2」が返りました。
続行するには何かキーを押してください . . .
どうやら一番最後に呼び出されたメソッドの戻り値が戻ってくるようですね。
ちなみに VB.NET のコードも載せようかと思ったんですが、 VB.NET の方はコンパイラが「戻り値を定義したイベントハンドラは使用できません」と文句を言ってきました。VB.NET ではできなうようです。
.NET Framework では戻り値をもつようなイベントハンドラを使わずにイベント引数「xxxEventArgs」に値をセットして返すのが定石ですね。