我有一个接口A,B类继承自接口A. 我有一个对象列表:
List<B> myB;
List<A> myA;
我想将myB分配给myA但是我收到错误“无法将类型'B'隐式转换为'A':
myA = myB;
请帮帮我。感谢。
答案 0 :(得分:1)
您需要转换列表中的每个元素。它无法自动转换为您。最简单的是Linq:
myA = myB.Cast<A>().ToList();
更新:这个问题:Why is this cast not possible?会更详细地讨论它。
答案 1 :(得分:0)
它可能会对您有所帮助:Cast List<int> to List<string> in .NET 2.0
答案 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
{
}
答案 3 :(得分:0)
您需要在类型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();
因为编译器无法知道如何做出AA
来自A
的额外位。
您也可以以一种相当人为的方式使用隐式转换:
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();
这可以在任何一个方向上工作,但可能会造成混淆,因此最好创建显式转换方法并使用它们。
答案 4 :(得分:-1)
这是正确的。列表是苹果列表,列表是..错误..蝙蝠侠列表!你不能试图把一个放到另一个。
从技术上讲,你不能将其称为另一个!