在列表对象中强制转换
本文关键字:转换 列表 对象 | 更新日期: 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
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是……呃. .蝙蝠侠!你不能把一个放进另一个。
从技术上讲,您不能将一个引用为另一个!