将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
但是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
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
List
和IList
不支持协方差。 所以这不编译:
List> list = new List>(); // DOES NOT COMPILE!!!!!