2012-10-10 23 views
30

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.

+1

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

+0

@jeroenh: C# 4.5 VS2012. –

+0

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

Trả lời

3

Được xác nhận là lỗi và now fixed

Cập nhật: bài viết Kết nối không còn tồn tại. Lỗi đã được sửa.

+1

Đáng tiếc chúng tôi sẽ không bao giờ biết khi nào điều này sẽ liên lạc với chúng tôi. Microsoft thực sự nên giao tiếp tốt hơn trên trang web đó ... – leppie

1

Lúc đầu - Đây là cách có thể làm thế nào để sửa lỗi này, nhưng có lẽ không phải là câu trả lời cho câu hỏi của bạn. (Nhưng ý kiến ​​không có mã định dạng)

Tôi tin rằng điều này tương tự như sau: Outer Variable Trap, vì bạn đang sử dụng phương thức Foo() làm biến và có lỗi (hoặc có thể là một tính năng) trong .NET

tôi đã cố gắng để thay đổi phương thức Bàng() để này

public void Bang() 
{ 
    Action baseMethod = base.Foo<string>; 
    Action bang = new Action(delegate { baseMethod(); }); 
    bang(); //VerificationException is thrown 
} 

và nó hoạt động và kết quả là "cơ sở"

tôi hy vọng nó sẽ giúp một chút.

+0

FYI, Comments * do * có định dạng mã, bạn không thể bao gồm ngắt dòng và vẫn bị giới hạn bởi tổng số ký tự (bao gồm đánh dấu) –

Các vấn đề liên quan