将IList转换为List

Pan*_*kaj 59 c# ilist casting list

我正在尝试将IList类型转换为List类型,但每次都会出错.

List<SubProduct> subProducts= Model.subproduct;
Run Code Online (Sandbox Code Playgroud)

Model.subproduct回报IList<SubProduct>.

Pbi*_*off 117

尝试

List<SubProduct> subProducts = new List<SubProduct>(Model.subproduct);
Run Code Online (Sandbox Code Playgroud)

要么

List<SubProduct> subProducts = Model.subproducts as List<SubProduct>;
Run Code Online (Sandbox Code Playgroud)

  • 这是正确的答案,但有没有理由要处理List而不是IList?大多数时候使用IList是更好的选择. (5认同)
  • 第二个选项并不安全,因为它假设`Model.subproducts`已经是'List <SubProduct>`类型.如果它是`IList <SubProduct>`的不同实现,例如`ReadOnlyCollection <SubProduct>`,它将静默地返回null,并且可能在程序执行的后期引起非常混乱的`NullReferenceException`.实际上,如果我们知道它总是会成为一个`List <T>`,那么首先返回一个`IList <T>`有什么意义呢? (5认同)
  • @KeithRousseau我在需要使用AddRange()方法时遇到了这个问题. (4认同)
  • IList <SubProduct> subProducts = Model.subproduct; (3认同)

Mar*_*ann 32

这个怎么样:

List<SubProduct> subProducts = Model.subproduct.ToList();
Run Code Online (Sandbox Code Playgroud)


blu*_*ish 10

在我的情况下,我必须这样做,因为没有建议的解决方案可用:

List<SubProduct> subProducts = Model.subproduct.Cast<SubProduct>().ToList();
Run Code Online (Sandbox Code Playgroud)


Web*_*euw 5

List<SubProduct> subProducts= (List<SubProduct>)Model.subproduct;
Run Code Online (Sandbox Code Playgroud)

隐式转换失败是因为List<>Implements IList,而不是反之亦然。所以你可以说IList<T> foo = new List<T>(),但不能List<T> foo = (some IList-returning method or property)