C’è un delegato che non è un MulticastDelegate in C #?

Penso che la risposta sia no? In caso contrario, perché abbiamo separato le classi Delegate e MulticastDelegate ? Forse è di nuovo a causa di “altri linguaggi .NET”?

    EDIT: Ho pensato che questo fosse parte dell’ECMA 335, ma non riesco a vederlo lì da nessuna parte.

    Non è ansible creare un tipo di delegato in C #, ma in IL:

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

    Il compilatore C # non ha problemi nell’utilizzare un delegato del genere:

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

    Ma il CLR fa quando tenta di caricarlo:

    Eccezione non gestita: System.TypeLoadException: imansible caricare il tipo “Foo” dall’assembly “Foo, Version = 0.0.0.0, Culture = neutral, PublicKeyToken = null” perché non può ereditare direttamente dalla class del delegato. a Test.Main ()

    Fondamentalmente la separazione Delegato / MulticastDelegate è un incidente storico. Credo che le prime versioni alfa / beta facessero la differenza, ma risultò troppo confusa e generalmente non utile – così ora ogni delegato deriva da MulticastDelegate.

    (È interessante notare che la specifica C # menziona solo MulticastDelegate una volta, nell’elenco dei tipi che non possono essere usati come vincoli generici).

    No, non c’è, perché tutti i delegati devono essere naturalmente in grado di essere Delegate.Combine . Delegato è lì semplicemente per avvolgere la funzionalità non multicasting in una class base.

    System.MuticastDelegate è derivato da System.Delegate. Ogni livello all’interno della gerarchia dei delegati fornisce un diverso insieme di servizi. System.Delegate è un contenitore dei dati per quale metodo chiamare su un particolare object. Con System.MulticastDelegate arriva la capacità aggiuntiva non solo di invocare un metodo su un singolo object, ma su un insieme di oggetti. Ciò consente a più abbonati di un evento.

    Non sono sicuro, ho risposto alla tua domanda.

    No, il CLR non lo consente.

    Ricordo qualcosa che volevano esporre direttamente Delegate , ma non è mai stato necessario.