在List对象中强制转换

时间:2011-04-15 08:11:22

标签: c# .net

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

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

我想将myB分配给myA但是我收到错误“无法将类型'B'隐式转换为'A':

myA = myB;

请帮帮我。感谢。

5 个答案:

答案 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
{
}

请参阅此previous SO Question

答案 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)

这是正确的。列表是苹果列表,列表是..错误..蝙蝠侠列表!你不能试图把一个放到另一个。

从技术上讲,你不能将其称为另一个!