无法将类型'System.Collections.IList'隐式转换为'System.Collections.Generic.List

时间:2015-05-05 11:27:27

标签: c# .net generics

这是我遇到的错误

  

错误1无法将类型System.Collections.Generic.IList<Model.DTO.RoleDTO>隐式转换为System.Collections.Generic.List<Model.DTO.RoleDTO>。存在显式转换(您是否错过了演员?)

我的代码:

IList<RoleDTO> rl = new List<RoleDTO>();

        rl.Add(new RoleDTO{ roleId = new Guid("D3DCBCDA-AD61-4764-B5A1-057D654F1C26"), 
role = "admin" });


UserDTO user = new UserDTO 
             {
                username = "administrator",
                email = "administrator@email.com",
                role = rl
             };

模特:

namespace Model.DTO
{
    public class UserDTO
    {
        public string username { get; set; }
        public string email { get; set; }
        public IList<RoleDTO> role { get; set; }
    }

    public class RoleDTO
    {
        public Guid roleId { get; set; }
        public string role { get; set; }
    }
}

我该如何正确地做到这一点?

3 个答案:

答案 0 :(得分:8)

只需将r1更改为IList<RoleDTO>

IList<RoleDTO> rl = new List<RoleDTO>();

您不能混合使用通用列表和非通用列表,因为IList<T>不会从IList继承而List<T>不会从List继承并且不会实现IList

修改

根据您遇到的新错误,这意味着您尝试将IList<RoleDTO>转换为List<RoleDTO>的某个地方无法隐式执行,因为任何人都可以编写实现{{1}的类}。因此,您需要进行显式转换,或更改要匹配的类型。问题是您的当前代码不会显示IList<RoleDTO>被隐式转换为IList<RoleDTO>的任何位置。但这是我的一些猜测。如果List<RoleDTO>实际上定义为UserDTO.roles而不是List<RoleDTO>,则只需将IList<RoleDTO>更改为r1或将List<RoleDTO>更改为UserDTO.roles一个IList<RoleDTO>。后者是我的偏好。如果您要将UserDTO.roles分配给List<RoleDTO>类型的变量,则应将该变量的类型更改为IList<RoleDTO>

答案 1 :(得分:2)

您将rl声明为IList,而不是IList<RoleDTO>

改变这个:

IList rl = new IList<RoleDTO>();

为此:

IList<RoleDTO> rl = new List<RoleDTO>

答案 2 :(得分:0)

您只需要更新

即可
    rl.Add(new UserDTO { roleId = new Guid("D3DCBCDA-AD61-4764-B5A1-057D654F1C26"), role = "admin" });

    rl.Add(new RoleDTO{ roleId = new Guid("D3DCBCDA-AD61-4764-B5A1-057D654F1C26"), role = "admin" });