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'”的含义。我只是不明白为什么会这样。这不是协方差吗?

4

1 回答 1

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>();
于 2012-07-02T13:32:16.407 回答