2012-07-02 53 views
6

说我有以下三个类/接口:为什么这个泛型类型不能转换?

public interface IImportViewModel 
{ 

} 

public class TestImportViewModel : IImportViewModel 
{ 

} 

public class ValidationResult<TViewModel> where TViewModel : IImportViewModel 
{ 

} 

由于TestImportViewModel实现IImportViewModel,为什么会下无法编译?

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

我明白了什么错误消息“无法隐式转换类型‘的ValidationResult’到‘的ValidationResult’”的意思。我只是不明白为什么会出现这种情况。这不是协变性吗?

+2

我假设你类_TestImportViewModel_应该是_TViewModel_? (上面的代码根本不显示类TViewmModel)。 –

+0

是的。 TestImportViewModel实现IImportViewModel从而__should__能够被用作TViewModel实现作为TViewModel:IImportViewModel。 – devlife

+3

@Sam TViewmModel(又名)是IImportViewModel类型,它不是一个类。 – Reniuz

回答

8

这会不会是协方差?

是的,除了在C#4.0协方差只适用于接口。所以,你必须让你ValidationResult实现协接口(一个用于其通用参数定义为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 
{ 
} 

,现在你可以这样做:

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

您仍然无法分配到'的ValidationResult '你只能分配给'IValidationResult '。这很不幸。 – ja72

+0

很好的解释@Darin。谢谢。 – devlife

相关问题