Xem đoạn mã sau:trình biên dịch tạo ra mã không chính xác cho các phương pháp vô danh [MS BUG FIXED]
public abstract class Base
{
public virtual void Foo<T>() where T : class
{
Console.WriteLine("base");
}
}
public class Derived : Base
{
public override void Foo<T>()
{
Console.WriteLine("derived");
}
public void Bang()
{
Action bang = new Action(delegate { base.Foo<string>(); });
bang(); //VerificationException is thrown
}
}
new Derived().Bang();
ném một ngoại lệ. Bên trong CIL tạo của phương pháp Bang
tôi nhận:
call instance void ConsoleApp.Derived::'<>n__FabricatedMethod1'<string>()
và chữ ký của người biên dịch phương pháp tạo:
method private hidebysig
instance void '<>n__FabricatedMethod1'<T>() 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<!!T>()
IL_0006: ret
}
Tôi nghĩ rằng mã chính xác nên được '<>n__FabricatedMethod1'<class T>
. Nó là một lỗi? Nhân tiện, không sử dụng delegate{ }
(biểu thức lambda giống nhau), mã hoạt động tốt với các đường cú pháp.
Action good = new Action(base.Foo<string>());
good(); //fine
EDIT Tôi đang sử dụng VS2012 RTMRel trong Windows8 RTM, net framework 4,5
EDIT lỗi này bây giờ là cố định.
Mã của bạn hoạt động cho tôi. Bạn đang sử dụng phiên bản C# /. Net/Visual Studio nào? Bạn đang nhắm mục tiêu nền tảng nào? – jeroenh
@jeroenh: C# 4.5 VS2012. –
Tôi đã thử với VS2010, C# 4 và 3.5. Không có quyền truy cập vào năm 2012 ngay bây giờ nhưng chắc chắn sẽ cố gắng tối nay. – jeroenh