Общая проблема с типизацией списков - PullRequest
1 голос
/ 29 марта 2010

Я новичок в C # и застрял на следующем. У меня есть веб-сервис Silverlight, который использует 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();
    }
}

Это прекрасно работает, но я хочу сделать это более абстрактным. Первым шагом будет возврат List<EntityObject>, но это приводит к ошибке компилятора, например ::10000 *

[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

Ответы [ 5 ]

3 голосов
/ 29 марта 2010

Даже если Customer наследуется от EntityObject, List<Customer> не наследуется от List<EntityObject>, поскольку ковариация универсального типа не поддерживается (в C # 4.0 ковариация поддерживается для интерфейсов, но не для IList<T> ).

Если бы вы могли присвоить List<Customer> переменной типа List<EntityObject>, это позволило бы вам сделать что-то подобное:

List<EntityObject> list = new List<Customer>();
list.Add(new Product()); // assuming Product inherits from EntityObject

Этот код явно не работает: вы не можете добавить Product к List<Customer>. Вот почему это не разрешено

0 голосов
/ 29 марта 2010

Помимо data.Cast<EntityObject>().ToList(); вам, вероятно, потребуется определить производные типы как известные типы, поэтому WCF будет знать, как сериализовать производные объекты.

http://msdn.microsoft.com/en-us/library/ms730167.aspx

0 голосов
/ 29 марта 2010

Вы могли бы сделать

data.Cast<EntityObject>().ToList();
0 голосов
/ 29 марта 2010

Ваши данные var содержат объекты Customer, а вы возвращаете список с объектами EntityObjects.

Вам придется разыграть их:

data.ConvertAll(obj => (EntityObject) obj).ToList();
0 голосов
/ 29 марта 2010
[OperationContract]
public List<EntityObject> GetData()
{
    using (TestEntities ctx = new TestEntities())
    {
        var data = from rec in ctx.Customer
                   select (EntityObject)rec;
        return data.ToList();
    }
}

вы не можете разыграть List to List, даже если D наследуется от B. Это называется ковариацией и работает только с массивами. Он будет полностью представлен в C # 4.0

...