我写了一个方法
public List<List<object>> Fetch(string data)
,
我在里面创造
List<List<object>> p = new List<List<object>>();
我的老板现在想要返回IList<IList<object>>
而不是List<List<object>>
即
public IList<IList<object>> Fetch(string data)
,
所以当我尝试的时候
return (IList<IList<object>>) p; //throws an exception
我如何转换
List<List<object>>
至IList<IList<object>>
并返回List<List<object>>
感谢。
答案 0 :(得分:54)
您无法通过直接投射执行转换 - 这不安全。相反,你应该使用:
IList<IList<object>> ret = new List<IList<object>>();
然后,对于每个“子列表”,您可以使用:
// Or whatever
ret.Add(new List<object>());
最后,只需返回ret
。
你可以使用LINQ在你返回现有的List<List<object>>
时执行转换 - 但最好只是创建一个更合适的类型来开始,如上所示
要理解为什么某些现有答案是错误的,假设您可以这样做:
IList<IList<object>> p = new List<List<object>>();
然后这将是有效的:
List<List<object>> listOfLists = new List<List<object>>();
IList<IList<object>> p = listOfLists;
p.Add(new object[]);
List<object> list = p[0];
但是p[0]
是对object[]
的引用,而不是List<object>
...我们认为类型安全的代码看起来不再安全......
幸运的是,IList<T>
是不变的,以防止出现这个问题。
答案 1 :(得分:3)
var myOriginalList = new List<List<Object>>();
var converted = ((IList<IList<Object>>)myOriginalList.Cast<IList<Object>>().ToList()); // EDIT: Added .ToList() here
您不需要转换回来 - 您可以在IList
List
上执行任何操作。
答案 2 :(得分:2)
您必须将列表声明为
IList<IList<object>> list = new List<IList<object>>(); // Works!
这样可行,因为首先只创建外部列表。然后,您可以插入与IList<object>
兼容的单个项目:
list.Add(new List<object>());
list.Add(new object[10]);
答案 3 :(得分:1)
public IList<IList<object>> Fetch(string data)
{
IList<IList<object>> p = new List<IList<object>>();
// add your stuff here
return p;
}
答案 4 :(得分:1)
您需要将结果变量的声明从List<List<object>
更改为IList<IList<object>>
您可以针对List<IList<object>>
结果中的每个项目都可以是List<object>
static IList<IList<object>> Test()
{
IList<IList<object>> result = new List<IList<object>>();
var item = new List<object>() { "one", "two", "three" };
result.Add(item);
return result;
}
答案 5 :(得分:0)
List<T>
和IList<T>
不支持协方差。所以这不编译:
List<List<string>> list = new List<IList<string>>(); // DOES NOT COMPILE!!!!!