将List <List >转换为IList <IList >

我写了一个public List<List> Fetch(string data) ,里面创建List<List> p = new List<List>();

我的老板现在想要返回IList<IList>而不是List<List> ie
public IList<IList> Fetch(string data)

所以当我尝试return (IList<IList>) p; //throws an exception return (IList<IList>) p; //throws an exception

如何将List<List>转换为IList<IList>并返回List<List>

谢谢。

您不能通过直接铸造执行转换 – 这不安全。 相反,你应该使用:

 IList> ret = new List>(); 

然后,对于每个“子列表”,您可以使用:

 // Or whatever ret.Add(new List()); 

最后,回到ret

返回时, 可以使用LINQ执行现有List>的转换 – 但最好只创建一个更合适的类型,如上所示。


要理解为什么某些现有答案是错误的,假设您可以这样做:

 IList> p = new List>(); 

那么这将是有效的:

 List> listOfLists = new List>(); IList> p = listOfLists; p.Add(new object[]); List list = p[0]; 

但是p[0]object[]的引用,而不是List …我们认为类型安全的代码看起来不再安全……

幸运的是, IList是不变的,以防止这个问题。

 var myOriginalList = new List>(); var converted = ((IList>)myOriginalList.Cast>().ToList()); // EDIT: Added .ToList() here 

您不需要转换回来 – 您可以在List上执行IList上的任何操作。

您必须将列表声明为

 IList> list = new List>(); // Works! 

这是有效的,因为首先只创建外部列表。 然后,您可以插入与IList兼容的单个项目:

 list.Add(new List()); list.Add(new object[10]); 
 public IList> Fetch(string data) { IList> p = new List>(); // add your stuff here return p; } 

您需要将结果变量的声明从List更改为IList>

您可以针对List>实例化

结果中的每个项目都可以是List类型

  static IList> Test() { IList> result = new List>(); var item = new List() { "one", "two", "three" }; result.Add(item); return result; } 

ListIList不支持协方差。 所以这不编译:

 List> list = new List>(); // DOES NOT COMPILE!!!!!