2008-11-19 5 views
1

J'ai une classe SomeClass, qui peut se peupler à partir d'un datarow dans son constructeur. Cette classe implémente IInterface. Cependant, quand j'exécute le code ci-dessous:Exception lors de la conversion d'une classe concrète en interface dans une requête LINQ

Dim fpQuery As IEnumerable(Of IInterface) = _ 
    From dr As DataRow In DataLayer.SomeMethodToGetADataTable.AsEnumerable _ 
    Select New SomeClass(dr) 

Je reçois l'erreur

Unable to cast object of type 
'System.Data.EnumerableRowCollection`1[Classes.SomeClass]' 
to type 
'System.Collections.Generic.IEnumerable`1[Interfaces.IInterface]' 

Je devrais probablement ajouter que le code suivant fonctionne très bien.

Dim fpQuery As IEnumerable(Of SomeClass) = _ 
    From dr As DataRow In DataLayer.SomeMethodToGetADataTable.AsEnumerable _ 
    Select New SomeClass(dr) 

Comme le fait simple cast

Dim myInterface As IInterface = New SomeClass(myDataRow) 

Toutes les idées?

ÉDIT: Jon Skeet a trouvé son compte. J'ai utilisé le code suivant et cela a fonctionné parfaitement.

Dim fpQuery2 As IEnumerable(Of IInterface) = fpQuery.Cast(Of IInterface) 

Répondre

5

Vous rencontrez un manque de variance dans les génériques. Pour le mettre dans un exemple plus simple, vous ne pouvez pas traiter IEnumerable(Of String) comme IEnumerable(Of Object).

La chose la plus simple serait probablement d'ajouter un appel à Cast(Of TResult).

+0

Merci beaucoup - c'était exactement ce que je cherchais. –

Questions connexes