マルチキャスト デリゲートの戻り値の型は void である必要があります。そうでない場合、例外がスローされます。
その背後にある理由を知りたいのですが、複数のメソッドがデリゲートと同じ戻り値の型を持つ可能性がある場合はどうなりますか?
マルチキャスト デリゲートの戻り値の型は void である必要があります。そうでない場合、例外がスローされます。
その背後にある理由を知りたいのですが、複数のメソッドがデリゲートと同じ戻り値の型を持つ可能性がある場合はどうなりますか?
前提は間違っています。それはうまくいきます:
Func<int> func = delegate { Console.WriteLine("first part"); return 5; };
func += delegate { Console.WriteLine("second part"); return 7; };
int result = func();
これは、結果が void でないマルチキャスト デリゲートであり、正常に動作します。両方の部分が実行されたことをコンソールから確認できます。最後の項目の結果が返されます。これが真のマルチキャスト デリゲートであることを示すことができます。
if(func is MulticastDelegate) Console.WriteLine("I'm multicast");
そして、最初の行の直後でも「I'm multicast」と書き込みます(メソッドが 1 つしかリストされていない場合)。
個々の結果をさらに制御する必要がある場合は、次を使用しますGetInvocationList()
。
foreach (Func<int> part in func.GetInvocationList())
{
int result = part();
}
これにより、個々の結果を確認できます。
IL 用語では:
.class public auto ansi sealed Func<+ TResult>
extends System.MulticastDelegate`
つまり、Func<T>
から継承しMulticastDelegate
ます。基本的に、すべての意図と目的に対して、.NET のすべてのデリゲートはマルチキャスト デリゲートです。マネージ C++ で非マルチキャスト デリゲートを取得できるかもしれませんが、わかりません。しかし、確かに C# からではありません。
次の答えは事実上間違っています。現在、void 以外の戻り値の型を持つマルチキャスト デリゲートを持つことができるからです (これが常にそうであったかどうかについては、まだ陪審員は出ていません)。ただし、「言語がそのようなデリゲートを許可しないのはなぜですか?」という質問には答えているので、完全を期すために残しています。
今すぐ行って、マークに賛成票を投じてください。
複数のメソッドが複数の値を返すため、デリゲートの 1 つの戻り値は何でしょうか? 明らかに、すべての状況で満足できる答えはありません。マルチキャスト デリゲートは次のようにすべきであると主張できます。