c# – 无法将MyType隐式转换为MyType

前端之家收集整理的这篇文章主要介绍了c# – 无法将MyType隐式转换为MyType前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我不确定这是否是Covariance和Contravariance问题,但我不能让这个工作.这是代码
  1. public interface IDto { }
  2.  
  3. public class PaginatedDto<TDto> where TDto : IDto {
  4.  
  5. public int PageIndex { get; set; }
  6. public int PageSize { get; set; }
  7. public int TotalCount { get; set; }
  8. public int TotalPageCount { get; set; }
  9.  
  10. public bool HasNextPage { get; set; }
  11. public bool HasPrevIoUsPage { get; set; }
  12.  
  13. public IEnumerable<TDto> Dtos { get; set; }
  14. }
  15.  
  16. public class PersonDto : IDto {
  17.  
  18. public int Id { get; set; }
  19. public string Name { get; set; }
  20. public string Surname { get; set; }
  21. public int Age { get; set; }
  22. }
  23.  
  24. class Program {
  25.  
  26. static void Main(string[] args) {
  27.  
  28. var people = new List<PersonDto> {
  29. new PersonDto { },new PersonDto { },};
  30.  
  31. var paginatedPersonDto = new PaginatedDto<PersonDto>() {
  32. Dtos = people
  33. };
  34.  
  35. //ProcessDto doesn't accept this
  36. ProcessDto(paginatedPersonDto);
  37. }
  38.  
  39. private static void ProcessDto(PaginatedDto<IDto> paginatedDto) {
  40.  
  41. //Do work...
  42. }
  43. }

出于某种原因,我无法通过PaginatedDto< PersonDto>如PaginatedDto< IDto>到ProcessDto方法.知道如何解决这个问题?

解决方法

是的,这是一个差异问题.您需要创建一个接口(只有接口和委托可以是共同/逆变)IPaginatedDto< out TDto> Dtos不能有一个setter(否则你不能用完):
  1. public interface IPaginatedDto<out TDto> where TDto : IDto
  2. {
  3. int PageIndex { get; set; }
  4. int PageSize { get; set; }
  5. int TotalCount { get; set; }
  6. int TotalPageCount { get; set; }
  7. bool HasNextPage { get; set; }
  8. bool HasPrevIoUsPage { get; set; }
  9. IEnumerable<TDto> Dtos { get; }
  10. }

和你的PaginatedDto< TDto>将实现此接口:

  1. public class PaginatedDto<TDto> : IPaginatedDto<TDto> where TDto : IDto
  2. {
  3.  
  4. public int PageIndex { get; set; }
  5. public int PageSize { get; set; }
  6. public int TotalCount { get; set; }
  7. public int TotalPageCount { get; set; }
  8.  
  9. public bool HasNextPage { get; set; }
  10. public bool HasPrevIoUsPage { get; set; }
  11.  
  12. public IEnumerable<TDto> Dtos { get; set; }
  13. }

并在您的方法中使用界面:

  1. private static void ProcessDto(IPaginatedDto<IDto> paginatedDto)
  2. {
  3.  
  4. //Do work...
  5. }

猜你在找的C#相关文章