C# 通用列表类型转换问题

C# 通用列表类型转换问题,c#,linq,silverlight,ado.net-entity-data-model,C#,Linq,Silverlight,Ado.net Entity Data Model,我是C语言的新手,对以下内容很感兴趣。我有一个Silverlight web服务,它使用LINQ查询ADO.NET实体对象。e、 g: [OperationContract] public List<Customer> GetData() { using (TestEntities ctx = new TestEntities()) { var data = from rec in ctx.Customer sel

我是C语言的新手,对以下内容很感兴趣。我有一个Silverlight web服务,它使用LINQ查询ADO.NET实体对象。e、 g:

[OperationContract]
public List<Customer> GetData()
{
    using (TestEntities ctx = new TestEntities())
    {
        var data = from rec in ctx.Customer
                   select rec;
        return data.ToList();
    }
}
这很好,但我想做的是让它更抽象。第一步是返回列表,但这会导致编译器错误,例如:

[OperationContract]
public List<EntityObject> GetData()
{
    using (TestEntities ctx = new TestEntities())
    {
        var data = from rec in ctx.Customer
                   select rec;
        return data.ToList();
    }
}
错误是:

Error 1 Cannot implicitly convert type 'System.Collections.Generic.List<SilverlightTest.Web.Customer>' to 'System.Collections.Generic.IEnumerable<System.Data.Objects.DataClasses.EntityObject>'. An explicit conversion exists (are you missing a cast?)
我做错了什么

谢谢

AJ

即使客户从EntityObject继承,列表也不会从列表继承,因为C 4.0不支持泛型类型协方差,协方差支持接口,但不支持IList

如果可以将列表分配给List类型的变量,则可以执行以下操作:

List<EntityObject> list = new List<Customer>();
list.Add(new Product()); // assuming Product inherits from EntityObject
这段代码显然是错误的:您无法将产品添加到列表中。这就是为什么这是不允许的

[OperationContract]
public List<EntityObject> GetData()
{
    using (TestEntities ctx = new TestEntities())
    {
        var data = from rec in ctx.Customer
                   select (EntityObject)rec;
        return data.ToList();
    }
}

即使D从B派生,也不能将列表强制转换为列表。它称为协方差,仅适用于数组。它将在C4.0中全面介绍,您的var数据包含客户对象,您的返回是一个包含EntityObjects的列表

你必须投下他们:

data.ConvertAll(obj => (EntityObject) obj).ToList();
你可以

data.Cast<EntityObject>().ToList();
除了data.Cast.ToList;,您可能需要在已知类型上定义派生类型,以便WCF知道如何序列化派生对象


我喜欢这个,但它不适合我,因为数据没有ConvertAll方法。