C# 无法将常规列表强制转换为自定义列表类型

C# 无法将常规列表强制转换为自定义列表类型,c#,.net,generics,collections,casting,C#,.net,Generics,Collections,Casting,我有两门课: public class MyClass { public int Foo { get; set; } public string Bar { get; set; } } public class MyList : List<MyClass> { } 代码编译良好,但引发运行时InvalidCastException: 无法将类型为“System.Collections.Generic.List`1[MyClass]”的对象强制转换为类型为“MyLi

我有两门课:

public class MyClass
{
    public int Foo { get; set; }
    public string Bar { get; set; }
}

public class MyList : List<MyClass>
{
}
代码编译良好,但引发运行时InvalidCastException:

无法将类型为“System.Collections.Generic.List`1[MyClass]”的对象强制转换为类型为“MyList”

我不明白为什么会发生这个错误,因为我的列表是一个列表

我发现了一些有关协方差的问题。与我的问题最为相似,但我不知道如何调整答案来解决我的问题

我的问题: 如何用DB记录构建MyList实例

我使用的是C和.NET4.0,每个MyList都是一个列表,但不是每个列表都是MyList。例如,如果您在MyList上有一个自定义属性,Linq的ToList方法将不知道它

您可以使用列表复制构造函数创建新的MyList:

return new MyList(records.Select(x => x.ConvertTo<MyClass>()).ToList());
public class MyList : List<MyClass>
{
    public MyList(IEnumerable<MyClass> list)
        : base(list)
    {
    }
}
编辑

正如@ekolis estutely所注意到的,您需要显式继承列表副本构造函数:

return new MyList(records.Select(x => x.ConvertTo<MyClass>()).ToList());
public class MyList : List<MyClass>
{
    public MyList(IEnumerable<MyClass> list)
        : base(list)
    {
    }
}

我还会退一步,看看您是否真的需要MyList类,或者您是否可以只使用List,甚至只使用IEnumerable。

您可以将派生类强制转换为基类,但您不能以其他方式执行。 如果您有:

public class Base {}
public class Derived : Base {}
可以将“派生”强制转换为“基础”,但不能将“基础”强制转换为“派生”

行得通 但不是

派生类可能比基类拥有更多的信息,这就是为什么


在您的情况下@D Stanley给了您解决方案

列表也不会自动列出。你可以创建一个接受列表的构造函数。子类是它的母亲类型,而不是相反。一位母亲可能有很多孩子。CA1002:DonotExposeGenericList-。。。记住这一点。请注意,您实际上需要创建此副本构造函数;它不会从列表继承。MyList类已序列化为XML。我使用它而不是普通列表,因为后者生成一个名为ArrayOfMyClass的XML元素,我希望能够控制XML元素的名称为自定义名称,在本例中为MyList。
Derived d = (Derived)new Base();