Есть ли делегат, который не является MulticastDelegate в C #? - PullRequest
8 голосов
/ 17 января 2011

Я думаю, что ответ НЕТ? Если нет, почему мы разделили классы Delegate и MulticastDelegate? Может быть, это снова из-за "некоторых других языков .NET"?

Ответы [ 4 ]

13 голосов
/ 17 января 2011

РЕДАКТИРОВАТЬ: Я думал это было частью 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' из сборки 'Foo, версия = 0.0.0.0, Culture = нейтральный, PublicKeyToken = null', поскольку он не может наследоваться непосредственно от класса делегата. в Test.Main ()

По сути, разделение Делегат / MulticastDelegate является исторической случайностью. Я полагаю, что ранние альфа / бета-версии действительно проводили различие, но это оказалось слишком запутанным и, как правило, бесполезным - так что теперь каждый делегат происходит от MulticastDelegate.

(Интересно, что спецификация C # упоминает MulticastDelegate только один раз в списке типов, которые нельзя использовать в качестве общих ограничений.)

2 голосов
/ 17 января 2011

System.MuticastDelegate является производным от System.Delegate.Каждый уровень в иерархии делегатов предоставляет свой набор услуг.System.Delegate - это контейнер данных для того, какой метод вызывать для определенного объекта.С System.MulticastDelegate предоставляется дополнительная возможность не только вызывать метод для отдельного объекта, но и для коллекций объектов.Это позволяет нескольким подписчикам на событие.

Не уверен, я ответил на ваш вопрос.

2 голосов
/ 17 января 2011

Нет, нет, потому что все делегаты должны иметь возможность иметь Delegate.Combine ред.Делегат существует просто для того, чтобы обернуть не-групповую функциональность в базовый класс.

1 голос
/ 17 января 2011

Нет, CLR не позволяет этого.

Я вспоминаю что-то, что они хотели выставить Delegate напрямую, но в этом не было необходимости.

...