2010-03-29 5 views
1

Je suis nouveau en C# et je suis bloqué sur ce qui suit. J'ai un service Web Silverlight qui utilise LINQ pour interroger un objet entité ADO.NET. par exemple:Problème de typage de liste générique

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

Cela fonctionne bien, mais ce que je veux faire est de rendre cela plus abstrait. La première étape serait de retourner un List<EntityObject> mais cela donne une erreur de compilation, .: par exemple

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

L'erreur est:

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?) 

Qu'est-ce que je fais mal?

Merci,

AJ

Répondre

3

Même si Customer hérite de EntityObject, List<Customer> ne hérite pas de List<EntityObject>, car covariance de type générique est pas pris en charge (en C# 4.0, covariance est pris en charge pour les interfaces, mais pas pour IList<T>).

Si vous pouvez attribuer un List<Customer> à une variable de type List<EntityObject>, il vous permettra de faire quelque chose comme ça:

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

Ce code est évidemment cassé: vous ne pouvez pas ajouter un Product à un List<Customer> . Voilà pourquoi il est pas permis

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

vous ne pouvez pas jeter Liste à la liste même si D dérive de B. Elle est appelée covariance et travaille avec des tableaux seulement. Il sera entièrement introduit en C# 4.0

0

Vos données var contiennent des objets Customer, votre retour est une liste avec EntityObjects.

Vous devrez les jeter:

data.ConvertAll(obj => (EntityObject) obj).ToList(); 
+0

J'aime, mais il ne fonctionne pas pour moi que les données ne sont pas une méthode ConvertAll. –

0

Vous pouvez faire

data.Cast<EntityObject>().ToList();