无法将MyType 隐式转换为MyType

我不确定这是否是Covariance和Contravariance问题,但我不能让这个工作。 这是代码:

public interface IDto { } public class PaginatedDto where TDto : IDto { public int PageIndex { get; set; } public int PageSize { get; set; } public int TotalCount { get; set; } public int TotalPageCount { get; set; } public bool HasNextPage { get; set; } public bool HasPreviousPage { get; set; } public IEnumerable Dtos { get; set; } } public class PersonDto : IDto { public int Id { get; set; } public string Name { get; set; } public string Surname { get; set; } public int Age { get; set; } } class Program { static void Main(string[] args) { var people = new List { new PersonDto { }, new PersonDto { }, new PersonDto { }, }; var paginatedPersonDto = new PaginatedDto() { Dtos = people }; //ProcessDto doesn't accept this ProcessDto(paginatedPersonDto); } private static void ProcessDto(PaginatedDto paginatedDto) { //Do work... } } 

出于某种原因,我不能将PaginatedDto作为PaginatedDto传递给ProcessDto方法。 知道如何解决这个问题?

是的,这是一个差异问题。 你需要创建一个接口(只有接口和委托可以是共同/逆变) IPaginatedDto其中Dtos不能有一个setter(否则你不能使用):

 public interface IPaginatedDto where TDto : IDto { int PageIndex { get; set; } int PageSize { get; set; } int TotalCount { get; set; } int TotalPageCount { get; set; } bool HasNextPage { get; set; } bool HasPreviousPage { get; set; } IEnumerable Dtos { get; } } 

而你的PaginatedDto将实现这个接口:

 public class PaginatedDto : IPaginatedDto where TDto : IDto { public int PageIndex { get; set; } public int PageSize { get; set; } public int TotalCount { get; set; } public int TotalPageCount { get; set; } public bool HasNextPage { get; set; } public bool HasPreviousPage { get; set; } public IEnumerable Dtos { get; set; } } 

并在您的方法中使用接口:

 private static void ProcessDto(IPaginatedDto paginatedDto) { //Do work... }