加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 08:40:00 所属栏目:百科 来源:网络整理
导读:我不确定这是否是Covariance和Contravariance问题,但我不能让这个工作.这是代码: public interface IDto { }public class PaginatedDtoTDto where TDto : IDto { public int PageIndex { get; set; } public int PageSize { get; set; } public int TotalCo
我不确定这是否是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 { },};

        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不能有一个setter(否则你不能用完):
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...
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读