РЕДАКТИРОВАТЬ: Я думал это было частью 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 только один раз в списке типов, которые нельзя использовать в качестве общих ограничений.)