0

我不能分享我的代码,基本上我有一个类实现接口,如下所示:

public interface A
{
    void doA();
}

public class B: A
{
    public void doA()
    {
     // Doing A
    }
}

我有一个像这样的 A 列表:

List<B> list = new List<B>();
list.Add(new B());

现在我想要一个IEnumerable<A>。所以我尝试了这 3 行:

List<A> listCast = (List<A>)list;
IEnumerable<A> listCastToEnumerable = (IEnumerable<A>)list;
IEnumerable<A> listCastExt = list.Cast<A>();
  1. 第一个有错误:

“错误 1 ​​无法将类型转换 'System.Collections.Generic.List<WindowsFormsApplication1.B>''System.Collections.Generic.List<WindowsFormsApplication1.A>'”。

  1. 第二个没有出错,但得到了InvalidCastException.

  2. 第三个起作用了。

我的问题是:

  1. 为什么第一行有错误,而第二行没有?
  2. 为什么前两行无效?
  3. 进行这种演员阵容的最佳方法是什么?第三行是否有好处或有更好的方法
4

3 回答 3

1

让我们分解一下。

1.为什么第一行有错误,而第二行没有?

在第二行,您将转换IEnumerable(T)为协变的。

2.为什么前两行无效?

即使您投射您的List<B>,它仍然保留其基础类型信息,这意味着它不能保存不属于 B 类型的 A 类型项目。

3.进行这种演员阵容的最佳方法是什么?第三行是否有好处或有更好的方法

第三行将每个元素List转换为 A 类型并返回一个 A 类型的新元素IEnumerable(T)。这可以迭代成一个ListA 类型的新元素,它将很高兴地保存任何 A 类型的元素。

于 2013-07-03T12:18:28.163 回答
0

你也可以做

 IEnumerable<A> listoftypeb = list.OfType<A>();

如果您有一个无法键入 A 的元素,这将为您提供一个没有错误的 A 列表

于 2013-07-03T12:23:08.373 回答
0

您需要创建一个 IEnumerable(T) 并使用列表中的数据填充它,因为 List<B>不是IEnumerable<A>

于 2013-07-18T22:24:32.923 回答