-1

我正在尝试列出一个列表。

public class Base
{
}

public class Item: Base
{
}

然后在另一个类中我有属性 requestList1

public List<Base> requestList1{ get; set; }

尝试:

requestList1 = form.item.Cast<Item>()
requestList1  = new List<Item>(form.item)

错误 CS0266 无法将类型“System.Collections.Generic.IEnumerable”隐式转换为“System.Collections.Generic.List”。存在显式转换(您是否缺少演员表?)

4

1 回答 1

0

您不能直接将它们相互转换。考虑以下情况:

public class Base
{
}

public class Item: Base
{
}

public class EvilItem: Base
{
}

所以让我们尝试从List<Item>to 转换List<Base>

List<Item> a = new List<Item>();
List<Base> b = (List<Base>)a;

b.Add(new EvilItem());

我们有一个问题。因为List<T>是引用类型,所以ab现在都是对同一个列表的引用。我们只是在 a 中添加了EvilItem一个List<Item>- 一些不应该被允许的东西。但这条线b.Add(new EvilItem());是完全合法的,因为bList<Base>.

这也反过来。如果您创建 aList<Base>那么您不能将其转换为 a List<Item>,因为其中的某些项目可能是EvilItem. 或者他们可能会在以后添加。

所以.NET 禁止这样的转换。

你有几个选择。首先,您可以创建列表的副本:

b = new List<Base>(a);

现在ab是两个完全不同的列表,它们恰好具有相同的内容。请记住,更改一个列表不会更改另一个列表。

或者,如果您不需要修改列表,则可以将其用作可枚举:

IEnumerable<Base> c = a;

为什么这行得通是一个更长的故事,但为了简化它 -IEnumerable只允许你阅读列表,所以你不能做像添加EvilItem到它的坏事。因此是允许的。

至于为什么requestList1 = form.item.Cast<Item>()不起作用 -Cast<T>()产生 a IEnumerable<T>,而不是 a List<T>,所以你不能分配它。您可以将其更改为requestList1 = form.item.Cast<Base>().ToList(),这将起作用 - 但它也会复制列表。实际上,这是另一种方法,虽然写起来有点长,而且我也怀疑它的效率有点低(但我没有证据)

于 2019-08-08T12:48:44.837 回答