无法转换List <list <int>&gt;返回类型IList <ilist <int>&gt;

时间:2018-02-02 02:03:51

标签: c# .net list generics generic-collections

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

  

无法隐式转换类型&#39; System.Collections.Generic.List<System.Collections.Generic.List<int>>&#39;到&#39; System.Collections.Generic.IList<System.Collections.Generic.IList<int>>&#39;。存在显式转换(您是否错过了演员?)

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

3 个答案:

答案 0 :(得分:4)

只需将结果声明更改为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;
}

答案 1 :(得分:0)

非常肯定,如果它编译,做一个演员是一个真正的坏主意。这就是原因:

public class myStupidList : IList<int>
{
//implementation unimportant
}

private void Button_Click(object sender, RoutedEventArgs e)
{
  var result = new List<List<int>>();
  IList<IList<int>> imNotAListofLists = (IList<IList<int>>)result;
  imNotAListofLists.Add(new myStupidList());
  //result is not a very valid variable right now, is it?
}

正如我的评论中所提到的,这些类型的集合问题归结为covariancecontravariance,.NET确实提供了许多处理它们的工具。 (例如各种只读集合和接口)

..其中,解释了为什么你也得到了你的错误。从List<List>List<IList>没有隐式强制转换,因为在不破坏类型安全的情况下,强制转换无法成功。 (正如@Grax所提到的,两者都不是来自另一个)

答案 2 :(得分:0)

应该进行显式转换,如下所示:-

List<IList<int>> result = new List<IList<int>>();

var result = new List<IList<int>>();