c# - 无法将 Type<Food> 隐式转换为 My Type<IFood>

标签 c# covariance implicit-conversion 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方法。知道如何解决这个问题吗?

最佳答案

是的,这是一个差异问题。您需要创建一个接口(interface)(只有接口(interface)和委托(delegate)可以协变/逆变)IPaginatedDto<out TDto> Dtos在哪里不能有 setter(否则你不能使用 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>将实现这个接口(interface):

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; }
}

并在你的方法中使用接口(interface):

private static void ProcessDto(IPaginatedDto<IDto> paginatedDto)
{

    //Do work...
}

关于c# - 无法将 Type<Food> 隐式转换为 My Type<IFood>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12129606/

相关文章:

c# - 无法将 void 转换为 int

c# - 继承和转换错误(通用接口(interface))

c++ - G++ 没有预期的编译错误。而是进行 "random"转换

c++ - g++ 编译器选项,用于警告类型转换与 ublas::bounded_vector

c# - "Double"不是 't get cast as "IComparable<Double>"

c++ - 如何修复隐式转换的 C++ 警告?

c# - 是否可以将数组绑定(bind)到 DataGridView 控件?

c# - 将窗口设置为在MVVM中隐藏后捕获屏幕

c# - 如何将 ListItemCollection (dropdownlist.items) 转换为字典<string,string>?

python - 不使用 numpy 计算协方差矩阵