在列表对象中强制转换

本文关键字:转换 列表 对象 | 更新日期: 2023-09-27 17:50:20

我有一个接口A,类B继承自接口A。我有一个对象列表:

List<B> myB;
List<A> myA;

我想分配myB给myA,但我得到一个错误"不能隐式转换类型'B'到' a ':

myA = myB;

请帮帮我。谢谢。

在列表对象中强制转换

您需要转换列表中的每个元素。它不能自动为您转换。最简单的是Linq:

myA = myB.Cast<A>().ToList();

Update:这个问题:为什么这个强制转换是不可能的?

这可能会对您有所帮助:List.NET 2.0

IList<T>不是协变的,其中IEnumerable<T>是,您可以执行以下操作…

void Main()
{
     IEnumerable<B> myB= new List<B>();
     IEnumerable<A> myA = myB;
}

public interface A
{
}
public class B :A
{
}

参见上一个SO问题

需要在类型A和类型B之间进行转换。

不能将一种类型的列表赋值给另一种类型,除非类型B与类型A相同。

可以对派生类型使用Cast<T>操作符:

class A {}
class AA : A {}
List<AA> aas = new List<AA> {new AA()};
List<A> bunchofA = aas.Cast<A>().ToList();

这只在转换为派生较少的类型(从后代到祖先)时有效。这行不通:

List<A> bunchofA = new List<A> {new A()};
List<AA> aas = bunchofA.Cast<AA>.ToList();

因为编译器不知道如何从A中获得AA的额外位。

您还可以以一种相当做作的方式使用隐式转换:

class A
{
}
class B
{
    public static implicit operator B(A a)
    {
        return new B();
    }
    public static implicit operator A(B a)
    {
        return new A();
    }
}
List<B> bs = new List<B>{new B()};
List<A> bunchOfA = bs.Select(b => (A)b).ToList();

这可以在任何方向上工作,但可能会引起混淆,因此最好创建显式转换方法并使用它们。

正确。List是苹果列表,List是……呃. .蝙蝠侠!你不能把一个放进另一个。

从技术上讲,您不能将一个引用为另一个!

相关文章: