2009-05-19 18 views
6

私はVB.netで作業しており、インタフェース、IBarを実装するClass、Fooを持っています。私はFooのリストを持っていますが、IBarのリストを関数に渡す必要がありますが、DirectCastを使用していてもキャストエラーが発生しています。私のコードは、私がVB.netでオブジェクトが実装しているインターフェイスの一覧にオブジェクトの一覧をキャストするにはどうすればよいですか?

Value of type 'System.Collections.Generic.List(Of FreezePod.Pod.Foo)' cannot be converted to 'System.Collections.Generic.List(Of FreezePod.Pod.IBar)'. 

MainWorksを取得し、メインとメイン2の両方で

Class Foo 
    Implements IBar 
End Class 

Interface IBar 
End Interface 

Sub DoIt(ByVal l As List(Of IBar)) 
End Sub 

Sub Main() 
    Dim FooList As New List(Of Foo) 
    DoIt(FooList) 
End Sub 

Sub Main2() 
    Dim FooList As New List(Of Foo) 
    DoIt(DirectCast(FooList, List(Of IBar))) 
End Sub 

Sub MainWorks() 
    Dim FooList As New List(Of Foo) 
    Dim IBarList As New List(Of IBar) 

    For Each f As Foo In FooList 
     IBarList.Add(f) 
    Next 

    DoIt(DirectCast(IBarList, List(Of IBar))) 
    DoIt(IBarList) 
End Sub 

で動作しますが、どこでも私は、この関数を呼び出したいことをしなければならないのは本当に迷惑と非効率的になります。

答えて

2

この解決策を別の回答として追加すると、これは必要な処理を行うはずです。

Sub DoIt(Of T As IBar)(ByVal l As List(Of T)) 
End Sub 

ジェネリックを使用してサブを定義する。

4

Duplicate questionただし、C#の場合(同じ問題)。そこにVBに変換することができます様々な答えがあります。あなたができない理由はcovariance and contravarianceです。

私はVBの人ではありませんが、私の好むC#の方法はSystem.Collections.Generic.List<T>.ConvertAll<Tout>(x => (Tout)x)に電話することです。 (それはVBに、ない場合、私は、それが変換する方法を知りません。)

VBの翻訳を:

System.Collections.Generic.List(Of T).ConvertAll(Of TOut)(Function(x) CType(x, TOut))

5

問題は(Tの)リストのような一般的なタイプは変換しないということですキャストが安全であることが保証されていても、他のリスト(Of U)にもちろん、VS2010ではこれを行うためのヘルプがありますが、今は本当に役に立ちません。

私はまた、ドイトは、リストの代わりにIBARのIEnumerableをを取ることができれば、あなたが行うことができ、にリンクされているスレッドで示唆されたと考えたよう:

DoIt(FooList.Cast(Of IBar)) 

またはあなたが本当にリストを必要に応じて(そしてできれば)オーバーヘッドを取る、あなたはリストを取得できます。

DoIt(FooList.Cast(Of IBar).ToList) 
1

は派生基本クラスではないオプションで、基本クラスがインタフェースを実装しています。それはそれを動作させるでしょう。

Class BaseFoo 
    Implements IBar 
End Class 

Class Foo 
    Inherits BaseFoo 
End Class 

Sub DoIt(ByVal l As List(Of BaseFoo)) 
End Sub 

何かが好きです。

+0

この場合、適切ではないでしょう。 IBarの実装者は、すでにインタフェースが行っていることとは全く関係のない、異なる基本クラスを持っています。しかし、もしこれが再び起これば、私はそれを念頭に置いておきます。 – thefroatgt

+0

サブクラスでジェネリックス手法を使用して更新しました。 – AnotherDan

+0

ジェネリックのアプローチをテストしました。これはスムーズに動作しているようです。 – AnotherDan

関連する問題