2012-07-02 36 views
6

Nói rằng tôi có sau ba lớp/giao diện:Tại sao loại chung loại này không được chuyển đổi?

public interface IImportViewModel 
{ 

} 

public class TestImportViewModel : IImportViewModel 
{ 

} 

public class ValidationResult<TViewModel> where TViewModel : IImportViewModel 
{ 

} 

Như TestImportViewModel thực hiện IImportViewModel, tại sao sẽ dưới đây không phải biên dịch?

ValidationResult<IImportViewModel> r = new ValidationResult<TestImportViewModel>(); 

Tôi hiểu thông báo lỗi "Không thể chuyển đổi loại xác thực 'ValidationResult' thành 'ValidationResult'" có nghĩa là gì. Tôi chỉ không hiểu tại sao lại như vậy. Điều này sẽ không hiệp phương sai?

+2

Tôi giả định của bạn class _TestImportViewModel_ được cho là _TViewModel_? (Mã trên không hiển thị TViewmModel lớp nào cả). –

+0

Có. TestImportViewModel triển khai thực hiện IImportViewModel và do đó __should__ có thể được sử dụng như một triển khai TViewModel như TViewModel: IImportViewModel. – devlife

+3

@Sam TViewmModel (aka ) là một loại IImportViewModel không phải là một lớp. – Reniuz

Trả lời

8

Đây có phải là hiệp phương sai không?

Có, ngoại trừ trong hiệp phương sai C# 4.0 chỉ hoạt động trên giao diện. Vì vậy, bạn sẽ phải thực hiện của bạn ValidationResult thực hiện một giao diện hiệp biến (một cho mà tham số chung được định nghĩa là out):

public interface IImportViewModel 
{ 
} 

public class TestImportViewModel : IImportViewModel 
{ 
} 

public interface IValidationResult<out TViewModel> where TViewModel : IImportViewModel 
{ 
} 

public class ValidationResult<TViewModel> : IValidationResult<TViewModel> where TViewModel : IImportViewModel 
{ 
} 

và bây giờ bạn có thể làm điều này:

IValidationResult<IImportViewModel> r = new ValidationResult<TestImportViewModel>(); 
+1

Bạn vẫn không thể gán cho 'ValidationResult ' bạn chỉ có thể gán cho 'IValidationResult '. Điều này là không may. – ja72

+0

Giải thích tuyệt vời @Darin. Cảm ơn. – devlife

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