Is there a Delegate which isn't a MulticastDelegate in C#?

后端 未结 4 2088
独厮守ぢ
独厮守ぢ 2020-12-18 00:12

I think the answer is NO? If there isn\'t, why do we have separated Delegate and MulticastDelegate classes? Maybe it\'s again because of \"some oth

相关标签:
4条回答
  • 2020-12-18 00:42

    No, the CLR does not allow that.

    I recall something that they wanted to expose Delegate directly, but that was never needed.

    0 讨论(0)
  • 2020-12-18 00:57

    EDIT: I thought this was part of ECMA 335, but I can't see it in there anywhere.

    You can't create such a delegate type in C#, but you can in IL:

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

    The C# compiler has no problems using such a delegate:

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

    But the CLR does when it tries to load it:

    Unhandled Exception: System.TypeLoadException: Could not load type 'Foo' from assembly 'Foo, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' because it cannot inherit directly from the delegate class. at Test.Main()

    Basically the Delegate/MulticastDelegate separation is an historical accident. I believe that early alpha/beta versions did make the distinction, but it proved too confusing and generally not useful - so now every delegate derives from MulticastDelegate.

    (Interestingly, the C# specification only mentions MulticastDelegate once, in the list of types which can't be used as generic constraints.)

    0 讨论(0)
  • 2020-12-18 00:58

    System.MuticastDelegate is derived from System.Delegate. Each level within the delegate hierarchy provides a different set of services. System.Delegate is a container of the data for what method to call on a particular object. With System.MulticastDelegate comes the additional capability of not only invoking a method on a single object, but on a collections of objects. This enables multiple subscribers to an event.

    Not sure, i have answered your question.

    0 讨论(0)
  • 2020-12-18 01:07

    No, there isn't, because all delegates must naturally be able to be Delegate.Combineed. Delegate is there simply to wrap the non-multicasting functionality into a base class.

    0 讨论(0)
提交回复
热议问题