无法将List <List <int >>转换为返回类型IList <IList <int >>

Tar*_*rak 5 .net c# generics list generic-collections

对于级别顺序遍历,为什么会发生此异常?发生以下异常:

无法将类型' System.Collections.Generic.List<System.Collections.Generic.List<int>>' 隐式转换为' System.Collections.Generic.IList<System.Collections.Generic.IList<int>>'。存在显式转换(您是否缺少演员表?)

public IList<IList<int>> LevelOrder(TreeNode root) 
{
    var result = new List<List<int>>();
    var que = new Queue<TreeNode>();

    //if(root==null) return result;

    que.Enqueue(root);
    while(que.Count!=0)
    {
        int n = que.Count;
        var subList = new List<int>();
        for(int i=0;i<n;i++)
        {
            if(que.Peek().left!=null) 
                que.Enqueue(que.Peek().left);
            if(que.Peek().right!=null)
                que.Enqueue(que.Peek().right);
            subList.Add(que.Dequeue().val);
        }
        result.Add(subList);
    }
    return  result;
}
Run Code Online (Sandbox Code Playgroud)

Gra*_*x32 5

只需将结果声明更改为即可List<IList<int>>

List<T>实现IList<T>,但List<List<T>> 不实现IList<IList<int>>。除非以这种方式定义,否则泛型参数不是协变或协变的IList<T>,因此类型必须完全匹配。

public IList<IList<int>> LevelOrder(TreeNode root)
{
    var result = new List<IList<int>>();
    var que = new Queue<TreeNode>();

    //if(root==null) return result;

    que.Enqueue(root);
    while (que.Count != 0)
    {
        int n = que.Count;
        var subList = new List<int>();
        for (int i = 0; i < n; i++)
        {
            if (que.Peek().left != null)
                que.Enqueue(que.Peek().left);
            if (que.Peek().right != null)
                que.Enqueue(que.Peek().right);
            subList.Add(que.Dequeue().val);
        }
        result.Add(subList);
    }
    return result;
}
Run Code Online (Sandbox Code Playgroud)