【问题标题】:Why can this generic type not be converted?为什么这个泛型类型不能转换?
【发布时间】:2012-07-02 21:38:11
【问题描述】:

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

public interface IImportViewModel
{

}

public class TestImportViewModel : IImportViewModel
{

}

public class ValidationResult<TViewModel> where TViewModel : IImportViewModel
{

}

由于TestImportViewModel实现了IImportViewModel,为什么下面的编译不出来?

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

我了解错误消息“无法将类型 'ValidationResult' 隐式转换为 'ValidationResult'”的含义。我只是不明白为什么会这样。这不是协方差吗?

【问题讨论】:

  • 我假设你的类 TestImportViewModel 应该是 TViewModel? (上面的代码根本没有显示类 TViewmModel)。
  • 是的。 TestImportViewModel 实现了 IImportViewModel,因此 应该 可以作为 TViewModel 的 TViewModel 实现使用:IImportViewModel。
  • @Sam TViewmModel(aka ) 是一种 IImportViewModel 它不是一个类。
  • @SamGoldberg,它是通用参数,通常被视为T,但在这种情况下具有更具描述性的名称。
  • Here is 类似问题的解释。

标签: c# generics


【解决方案1】:

这不是协方差吗?

是的,除了在 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>();

【讨论】:

  • 您仍然无法分配给ValidationResult&lt;IImportViewModel&gt;,您只能分配给IValidationResult&lt;IImportViewModel&gt;。这很不幸。
  • 很好的解释@Darin。谢谢。
猜你喜欢
  • 1970-01-01
  • 2023-03-12
  • 2012-01-15
  • 2016-07-12
  • 2018-11-04
  • 2011-12-28
  • 1970-01-01
  • 2019-06-24
  • 1970-01-01
相关资源
最近更新 更多