C# 转换列表<;列表<;对象>&燃气轮机;到IList<;IList<;对象>&燃气轮机;

C# 转换列表<;列表<;对象>&燃气轮机;到IList<;IList<;对象>&燃气轮机;,c#,.net,list,C#,.net,List,我写了一个方法,它是 公共列表获取(字符串数据), 我在里面创造 List p=newlist() 我的老板现在想返回一个IList而不是Listie 公共IList获取(字符串数据) 所以当我试着做的时候 return(IList)p//引发异常 我如何转换 List到IList并返回到ListList和IList不支持协方差。因此,这并不编译: List<List<string>> list = new List<IList<string>>(

我写了一个方法,它是
公共列表获取(字符串数据)
, 我在里面创造
List p=newlist()

我的老板现在想返回一个
IList
而不是
List
ie
公共IList获取(字符串数据)

所以当我试着做的时候
return(IList)p//引发异常

我如何转换
List
IList
并返回到
List

List
IList
不支持协方差。因此,这并不编译:

List<List<string>> list = new List<IList<string>>(); // DOES NOT COMPILE!!!!!
List List=new List();//不编译!!!!!
var myOriginalList=新列表();
var converted=((IList)myOriginalList.Cast().ToList());//编辑:在此处添加了.ToList()
您不需要重新转换-您可以在
IList
上执行
List

public IList Fetch(字符串数据)上可以执行的任何操作
public IList<IList<object>> Fetch(string data)
{
  IList<IList<object>> p = new List<IList<object>>();

  // add your stuff here

  return p;
}
{ IList p=新列表(); //把你的东西加在这里 返回p; }
您不能通过直接浇铸来执行转换-这不安全。相反,您应该使用:

IList<IList<object>> ret = new List<IList<object>>();
那么这将是有效的:

List<List<object>> listOfLists = new List<List<object>>();
IList<IList<object>> p = listOfLists;
p.Add(new object[]);
List<object> list = p[0];
List listOfLists=new List();
IList p=列表列表;
p、 添加(新对象[]);
列表=p[0];
但是
p[0]
是对
对象[]
的引用,而不是对
列表的引用。。。我们假定的类型安全代码看起来不再安全了


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

您必须将列表声明为

IList<IList<object>> list = new List<IList<object>>(); // Works!
IList list=new list();//作品
这是可行的,因为首先只创建外部列表。然后,您可以插入与IList兼容的单个项目:

list.Add(newlist());
列表.添加(新对象[10]);

您需要更改
列表中结果变量的声明如果您需要将其转换回您的设计很可能已损坏。
列表
已经是
IList
类型,不需要使用协方差(或反方差)。@AllenG那么您能解释一下我放的代码段没有编译的原因吗?@AllenG:Yes,此处需要使用逆变,因为
列表
不是
列表
。你试过编译Aliostad说不会编译的代码吗?真的不会。我在你添加代码片段之前添加了我的评论。列表应该是签名为IList的方法的有效返回。@AllenG:不,绝对不应该。这里的列表太多了。对于类型为返回IList的方法,List应该是有效的返回吗?对对于类型为返回IList的方法,List应该是有效的返回吗?不,绝对不是。调用者合理地期望他们可以将瓶子插入IList,但您手头的是一个不能包含瓶子的列表。因此,转换必须是非法的。为什么还要麻烦创建一个新的列表呢?一开始就创建正确的类型更简单。100%同意,您的方法很好地解释了这一点。我将此保留下来是为了表明,如果您需要这样做(例如,第三方库返回您需要转换为另一个第三方库的
列表
),您可以这样做。您是否暗示该列表可以替换为object[]。你确定你的例子在第二部分是正确的吗?@HasanKhan:我是说,
object[]
实现了
IList
,因此可以添加到任何
IList
——如果最后一块代码没有编译,那将是一件坏事。幸运的是它没有。@JonSkeet-oh不知道数组也实现了IList@JonSkeet感谢您的回答和详细的解释。@JonSkeet关于IList listOfList=tabOfTab其中
tabOfTab
double[][]
?@vidstige JonSkeet大约30秒都是正确的。。我最初拥有IList p=new List();它不会编译,也不应该编译。我在发帖10秒后注意到了我的错误。十秒钟。进一步证明JonSkeet实际上是一个机器人我不知道前几天和汉瑟曼说话的是谁……哈哈,很快就好了。但是我看不到你的帖子被编辑了?也许有一段“安静的时间”,你可以编辑它而不必进行新的修改。。。
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];
IList<IList<object>> list = new List<IList<object>>(); // Works!
list.Add(new List<object>());
list.Add(new object[10]);
    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;
    }