Unable to convert List> to return type IList>

前端 未结 3 1285
名媛妹妹
名媛妹妹 2021-01-18 01:31

For level order traversal why does this exception occur? Following exception occurs:

Cannot implicitly convert type \'System.Collections.Generic

相关标签:
3条回答
  • 2021-01-18 02:13

    Just change the declaration of your result to List<IList<int>>.

    List<T> implements IList<T>, but List<List<T>> does not implement IList<IList<int>>. Generic parameters are not covariant or contravariant unless defined that way and IList<T> is not, so the type must match exactly.

    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;
    }
    
    0 讨论(0)
  • 2021-01-18 02:13

    There should be explicit conversion and as shown below:-

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

    or

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

    0 讨论(0)
  • 2021-01-18 02:15

    Pretty sure that if it compiles, doing a cast is a real bad idea. Here's why:

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

    As mentioned in my comment, these types of collection issues boil down to covariance and contravariance, and .NET does provide a lot of tools for dealing with them. (Such as various read-only collections and interfaces)

    ..Which, explains why you get your error as well. There is no implicit cast from List<List> to List<IList> because that cast cannot succeed without breaking type-safety. (and as @Grax mentioned, neither derives from the other)

    0 讨论(0)
提交回复
热议问题