1

クラス SomeClass があります。これは、コンストラクターのデータ行から自分自身を設定できます。このクラスは IInterface を実装します。ただし、以下のコードを実行すると:

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

エラーが発生します

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

おそらく、次のコードが正常に機能することを追加する必要があります。

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

単純なキャストと同様に

Dim myInterface As IInterface = New SomeClass(myDataRow)

何か案は?

編集:Jon Skeetはそれをうまくやった. 次のコードを使用しましたが、完全に機能しました。

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

1 に答える 1

5

ジェネリックの分散が不足しています。もっと簡単な例で言えば、IEnumerable(Of String)として扱うことはできませんIEnumerable(Of Object)

最も簡単なのは、おそらくCast(Of TResult)への呼び出しを追加することです。

于 2008-11-19T14:33:55.250 に答える