C# 为什么不能转换此泛型类型?

C# 为什么不能转换此泛型类型?,c#,generics,C#,Generics,假设我有以下三个类/接口: public interface IImportViewModel { } public class TestImportViewModel : IImportViewModel { } public class ValidationResult<TViewModel> where TViewModel : IImportViewModel { } 公共接口IImportViewModel { } 公共类TestImportViewModel:

假设我有以下三个类/接口:

public interface IImportViewModel
{

}

public class TestImportViewModel : IImportViewModel
{

}

public class ValidationResult<TViewModel> where TViewModel : IImportViewModel
{

}
公共接口IImportViewModel
{
}
公共类TestImportViewModel:IImportViewModel
{
}
公共类验证结果,其中TViewModel:IImportViewModel
{
}
由于TestImportViewModel实现了IImportViewModel,为什么不编译以下内容

ValidationResult<IImportViewModel> r = new ValidationResult<TestImportViewModel>();
ValidationResult r=新的ValidationResult();
我理解错误消息“无法将类型“ValidationResult”隐式转换为“ValidationResult”的含义。我只是不明白为什么会这样。这不是协方差吗

这不是协方差吗

是的,除了在C#4.0中,协方差只在接口上起作用。因此,您必须使您的
验证结果
实现一个协变接口(通用参数定义为
out
):

公共接口IImportViewModel
{
}
公共类TestImportViewModel:IImportViewModel
{
}
公共接口IValidationResult,其中TViewModel:IImportViewModel
{
}
公共类ValidationResult:IValidationResult,其中TViewModel:IImportViewModel
{
}
现在你可以这样做了:

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

我假设您的类TestImportViewModel应该是TViewModel?(上面的代码根本不显示TViewmModel类)。是。TestImportViewModel实现IImportViewModel,因此应该能够作为TViewModel:IImportViewModel的TViewModel实现使用。@Sam TViewModel(aka)是IImportViewModel的一种类型,而不是类。@SamGoldberg,它是泛型参数,通常被视为
T
,但在本例中有一个更具描述性的名称。类似问题的解释。您仍然无法分配给
ValidationResult
,只能分配给
IValidationResult
。这是不幸的。很好的解释@Darin。谢谢
IValidationResult<IImportViewModel> r = new ValidationResult<TestImportViewModel>();