Код: Выделить всё
public abstract class Base
{
public virtual void Foo() where T : class
{
Console.WriteLine("base");
}
}
public class Derived : Base
{
public override void Foo()
{
Console.WriteLine("derived");
}
public void Bang()
{
Action bang = new Action(delegate { base.Foo(); });
bang(); //VerificationException is thrown
}
}
Код: Выделить всё
new Derived().Bang();Код: Выделить всё
call instance void ConsoleApp.Derived::'n__FabricatedMethod1'()
Код: Выделить всё
method private hidebysig
instance void 'n__FabricatedMethod1' () cil managed
{
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = (
01 00 00 00
)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void ConsoleApp.Base::Foo()
IL_0006: ret
}
Кстати, без использования делегата{ (лямбда-выражение то же самое) код прекрасно работает с синтаксическими сахарами.
Код: Выделить всё
Action good = new Action(base.Foo());
good(); //fine
Подробнее здесь: https://stackoverflow.com/questions/128 ... us-methods
Мобильная версия