[英]Convert Dictionary<MyType>.ValueCollection to IList<MyType>
[英]Cannot implicitly convert MyType<Foo> to MyType<IFoo>
我不确定这是否是Covariance和Contravariance问题,但我不能让这个工作。 这是代码:
public interface IDto { }
public class PaginatedDto<TDto> 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<TDto> 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<PersonDto> {
new PersonDto { },
new PersonDto { },
new PersonDto { },
};
var paginatedPersonDto = new PaginatedDto<PersonDto>() {
Dtos = people
};
//ProcessDto doesn't accept this
ProcessDto(paginatedPersonDto);
}
private static void ProcessDto(PaginatedDto<IDto> paginatedDto) {
//Do work...
}
}
出于某种原因,我不能将PaginatedDto<PersonDto>
作为PaginatedDto<IDto>
传递给ProcessDto
方法。 知道如何解决这个问题?
是的,这是一个差异问题。 您需要创建一个接口(仅限接口和委托可以共同/逆变) IPaginatedDto<out TDto>
其中Dtos
不能有一个二传手(否则你不能用out
):
public interface IPaginatedDto<out TDto> 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<TDto> Dtos { get; }
}
而你的PaginatedDto<TDto>
将实现这个接口:
public class PaginatedDto<TDto> : IPaginatedDto<TDto> 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<TDto> Dtos { get; set; }
}
并在您的方法中使用界面:
private static void ProcessDto(IPaginatedDto<IDto> paginatedDto)
{
//Do work...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.