2010-10-23 53 views
6

Nếu không và các thiết lập của các loại tài liệu tham khảo và các loại giá trị loại trừ lẫn nhau, tại sao không biên dịch này:Loại có thể là loại tham chiếu và loại giá trị cùng một lúc không?

bang
public static void Do<T>(T obj) where T : struct { } 
public static void Do<T>(T obj) where T : class { } 

Trình biên dịch: "Gõ đã định nghĩa một thành viên gọi là 'làm' với các loại thông số tương tự ", nhưng T và T không giống nhau ở đây. Một là ràng buộc với cấu trúc, cái còn lại là ràng buộc đối với các lớp. Cuộc gọi đến hàm phải luôn có thể giải quyết được. Có các ví dụ truy cập không?

+0

Thực ra, một bị ràng buộc với "loại tham chiếu" (bao gồm đại biểu, giao diện, v.v. không chỉ là các lớp), còn loại kia bị ràng buộc thành cấu trúc ** ngoại trừ ** 50% (có thể) cấu trúc có liên quan trong 'Nullable '. Những ràng buộc đó hiện không cho phép 'T === int?', Ví dụ. –

Trả lời

3

Các ràng buộc chung không được thực hiện như là một phần của quá tải khớp. Nó giống như kiểu trả về.

Ví dụ, điều này sẽ dẫn đến các lỗi tương tự (quá tải chỉ khác nhau ở kiểu trả về):

public static int Do<T>(T obj) { } 
public static bool Do<T>(T obj) { } 

Trong cả hai trường hợp này, các quy tắc cho phù hợp với một tình trạng quá tải đưa vào tài khoản chỉ các thông số chủng loại, bỏ qua các thông tin bổ sung như ràng buộc và kiểu trả về.

1

Không, các loại không bao giờ có thể là cả hai. Mã không thành công vì thông số chung (<T>, nghĩa là, không phải là T obj) không có khái niệm "quá tải". Cũng không có bất cứ điều gì giống với chuyên môn mẫu C++.

+0

Mặc dù bạn có thể kết hợp mọi thứ bằng nút thắt trên các loại giá trị đóng hộp;) –

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