我写了一个方法
public List<List<object>> Fetch(string data)
,在我创建的内部
List<List<object>> p = new List<List<object>>();
我的老板现在想要返回一个IList<IList<object>>
而不是List<List<object>>
ie
public IList<IList<object>> Fetch(string data)
,
所以当我尝试的时候
return (IList<IList<object>>) p; //throws an exception
我如何转换
List<List<object>>
为IList<IList<object>>
和返回List<List<object>>
谢谢.
Jon*_*eet 60
您不能通过直接铸造执行转换 - 这不安全.相反,你应该使用:
IList<IList<object>> ret = new List<IList<object>>();
Run Code Online (Sandbox Code Playgroud)
然后,对于每个"子列表",您可以使用:
// Or whatever
ret.Add(new List<object>());
Run Code Online (Sandbox Code Playgroud)
最后,回来吧ret
.
你可以使用LINQ来执行现有的转换List<List<object>>
,当您返回它-但它会更好,只是创造一个更加合适的类型入手,如上图所示.
要理解为什么某些现有答案是错误的,假设您可以这样做:
IList<IList<object>> p = new List<List<object>>();
Run Code Online (Sandbox Code Playgroud)
那么这将是有效的:
List<List<object>> listOfLists = new List<List<object>>();
IList<IList<object>> p = listOfLists;
p.Add(new object[]);
List<object> list = p[0];
Run Code Online (Sandbox Code Playgroud)
但是p[0]
是对a的引用object[]
,而不是List<object>
...我们所谓的类型安全代码看起来不再安全......
幸运的是,IList<T>
是不变的,以防止这个问题.
您必须将列表声明为
IList<IList<object>> list = new List<IList<object>>(); // Works!
Run Code Online (Sandbox Code Playgroud)
这是有效的,因为首先只创建了外部列表。然后,您可以插入与 兼容的单个项目IList<object>
:
list.Add(new List<object>());
list.Add(new object[10]);
Run Code Online (Sandbox Code Playgroud)
var myOriginalList = new List<List<Object>>();
var converted = ((IList<IList<Object>>)myOriginalList.Cast<IList<Object>>().ToList()); // EDIT: Added .ToList() here
Run Code Online (Sandbox Code Playgroud)
您不需要转换回来 - 您可以做任何IList
您可以做的事情List
。