10

答えはノーだと思いますか?ない場合、なぜ私たちはクラスDelegateを分けたのですか?MulticastDelegate多分それは「他のいくつかの.NET言語」のせいですか?

4

4 に答える 4

14

編集:これはECMA 335の一部だと思いましたが、どこにも表示されません。

C#ではそのようなデリゲートタイプを作成できませんが、ILでは作成できます。

.class public auto ansi sealed Foo
       extends [mscorlib]System.Delegate
{
    // Body as normal
}

C#コンパイラは、このようなデリゲートを使用しても問題はありません。

using System;

class Test
{
    static void Main()
    {
        Foo f = x => Console.WriteLine(x);
        f("hello");
    }
}

ただし、CLRは、ロードしようとしたときに実行します。

未処理の例外:System.TypeLoadException:デリゲートクラスから直接継承できないため、アセンブリ'Foo、Version = 0.0.0.0、Culture = neutral、PublicKeyToken=null'からタイプ'Foo'を読み込めませんでした。Test.Main()で

基本的に、Delegate/MulticastDelegateの分離は歴史的な事故です。初期のアルファ/ベータバージョンは区別をしたと思いますが、それはあまりにも混乱し、一般的には役に立たないことがわかりました-したがって、今ではすべてのデリゲートがMulticastDelegateから派生しています。

(興味深いことに、C#仕様では、ジェネリック制約として使用できないタイプのリストで、MulticastDelegateについて1回しか言及されていません。)

于 2011-01-17T08:13:58.433 に答える
2

Delegate.Combineいいえ、ありません。すべての代表者が自然に編集できる必要があるためです。デリゲートは、非マルチキャスト機能を基本クラスにラップするためだけにあります。

于 2011-01-17T08:09:50.447 に答える
2

System.MuticastDelegateは、System.Delegateから派生しています。デリゲート階層内の各レベルは、異なるサービスのセットを提供します。System.Delegateは、特定のオブジェクトで呼び出すメソッドのデータのコンテナーです。System.MulticastDelegateには、単一のオブジェクトだけでなく、オブジェクトのコレクションに対してメソッドを呼び出す追加機能があります。これにより、複数のサブスクライバーがイベントに参加できるようになります。

わかりません、私はあなたの質問に答えました。

于 2011-01-17T08:19:27.790 に答える
1

いいえ、CLRはそれを許可していません。

彼らが直接公開したかったことを思い出しますDelegateが、それは決して必要ではありませんでした。

于 2011-01-17T08:09:46.703 に答える