2010-05-16 26 views
6

một vài tuần trước một đồng nghiệp của tôi đã dành khoảng hai giờ tìm hiểu lý do tại sao đoạn mã C++/CLI này sẽ không biên dịch với Visual Studio 2008 (tôi vừa thử nghiệm nó với Visual Studio 2010 ... cùng một câu chuyện).Ràng buộc lớp giá trị C++/CLI sẽ không biên dịch. Tại sao?

public ref class Test 
{ 
    generic<class T> where T : value class 
     void MyMethod(Nullable<T> nullable) 
    { 

    } 
}; 

Trình biên dịch nói: Lỗi

1 lỗi C3214: 'T': loại không hợp lệ luận cho tham số chung 'T' của chung 'Hệ thống :: Nullable', không đáp ứng hạn chế 'Hệ thống :: ValueType ^' C: \ Users \ Simon \ Desktop \ Projektdokumentation \ GridLayoutPanel \ Generics \ Generics.cpp 11 1 Generics

Thêm ValueType sẽ làm cho việc biên dịch mã.

public ref class Test 
{ 
    generic<class T> where T : value class, ValueType 
     void MyMethod(Nullable<T> nullable) 
    { 

    } 
}; 

Câu hỏi của tôi hiện là. Tại sao? Sự khác nhau giữa value classValueType là gì?

Tái bút: Xem định nghĩa Nullable cho C++: http://msdn.microsoft.com/de-de/library/b3h38hb0.aspx

+0

Tôi đồng ý, ràng buộc lớp giá trị phải là đủ. Tôi nghĩ cách giải quyết của bạn là chính xác. Bạn có thể thử connect.microsoft.com để xem họ sẽ nói gì. –

Trả lời

5

tôi đã phân tích mã IL trong ba phương pháp sau:

generic<class T> where T : value class, System::ValueType 
    static void MyMethod(T arg) 
{ 

} 

generic<typename T> where T: value class 
    static void MyMethod2(T arg) 
{ 

} 

generic<typename T> where T: ValueType 
    static void MyMethod3(T arg) 
{ 
} 

Các tương ứng IL-mã, mà tôi dissassembled với NET-Reflector:

.method public hidebysig 
static void MyMethod<valuetype ([mscorlib]System.ValueType).ctor T> 
(!!T arg) cil managed 
{ 
} 


.method public hidebysig 
static void MyMethod2<valuetype .ctor T>(!!T arg) cil managed 
{ 
} 


.method public hidebysig 
static void MyMethod3<([mscorlib]System.ValueType) T>(!!T arg) cil managed 
{ 
} 

Đây là IL-khai của Nullable<T>:

.class public sequential ansi serializable sealed beforefieldinit 
Nullable<valuetype (System.ValueType) .ctor T> 
    extends System.ValueType 

Như bạn có thể thấy rõ ràng, chỉ ràng buộc của phương thức đầu tiên phù hợp 100% với Nullable<T>. (Btw: value class dường như ngụ ý sự hiện diện của một hàm tạo tiêu chuẩn). Tuy nhiên, tại sao trình biên dịch tạo ra mã IL khác nhau (ngữ nghĩa) cùng các ràng buộc, vẫn còn là một bí ẩn. Tôi sẽ hỏi C++/CLI Gurus của Microsoft để biết thêm thông tin.

0

ValueType là đặc biệt ở chỗ nó là "lớp cơ sở" của các loại giá trị, nhưng không phải là một kiểu giá trị riêng của mình. Đây có lẽ là vấn đề ở đây.

Danh sách đẹp các thực thể khác nhau được CLR sử dụng có thể được tìm thấy trong this excellent blog post.

Xem thêm thisthis thread để biết thêm thông tin cụ thể về số ValueType.

+0

Cảm ơn các nghiên cứu của bạn, Lucero. – Simon

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