2011-08-02 3 views
1

私は単に文字列のリストのリストである変数を使用しようとしています。 次のように私はそれを宣言した:IList(Of IList(Of String))を使用できますか?

Dim iRows As New List(Of List(Of String)) 

は、その後、私は別のメソッドにパラメータとして渡ししようとしていると、次のように私は、メソッドを定義した:

Public Sub Import(ByVal Rows As IList(Of IList(Of String))) 
    For Each Row As IList(Of String) In Rows 
     ImportRow(Row) 
    Next 
End Sub 

を残念ながら、ときそのコードを実行しようとすると、自分のメソッドに変数を渡そうとするときに次のエラーが発生します。

System.InvalidCastExceptionのは= "タイプのオブジェクトをキャストすることができません 'System.Collections.Generic.List 1[System.Collections.Generic.List 1 [可能System.String]]'「System.Collections.Generic.IList 1[System.Collections.Generic.IListを入力するためにユーザコードによって メッセージ未処理でした1 [System.String]] '。 "

次のようにインターフェイスではなくタイプを使用するようにメソッド定義を変更すると、機能します。

Public Sub Import(ByVal Rows As List(Of List(Of String))) 
    For Each Row As IList(Of String) In Rows 
     ImportRow(Row) 
    Next 
End Sub 

このように、インターフェイスでジェネリックを使用することはできませんか?私はそれらを入れ子にしていない限り、それは正常に動作します。このようなiRowsを宣言することによって

答えて

5

はい、それIList(Of IList(Of String))を作成することが可能である - しかし、List(Of (List(Of String))ものではありません。後者の場合、

listOfLists.Add(arrayOfStrings) 

として、IList(Of String)を実装すると考えてください。

基本的にこれはIList(Of Fruit)List(Of Banana)を考えているのとまったく同じです。バナナの束はフルーツボウルではありません。リンゴを追加することができないからです。

あなたのケースでは、またはの代わりにを作成する必要があります。IList(Of List(Of String))を宣言してください。 IEnumerable(Of T)Tで共変である -

今興味深いことに、あなたが原因一般的な共変性と反変性に.NET 4に​​としてList(Of List(Of String))を使用することができます。ただし、IList(Of T)は不変です。

一般的な共分散と反分散は、難題です。Eric Lippertさんはwritten a great deal about itを持っています - VBではなくC#をVBで使用していますが、うまくいけばそれを理解することができます。

+0

それはすべて今意味があります。ありがとうございました。 –

+0

IReadableList(Of Apple)はIReadableList(Of Fruit)を想定したコードで使用できるため、マイクロソフトではIListのIReadableList基本型を実装していません。しかし、既存のコードを壊すことなく、今のところこのようなことを実装するために、おそらくかなり厄介なランタイム・ハッキングが必要になるでしょう。 – supercat

+0

@supercat:はい、便利でした。それは難しいです - インターフェイスの分解が混乱の原因になりますが、あまりにもこの種のものにつながります。( –

2

スタート:あなたはiRowsnew List(Of String)を追加するとき

Dim iRows As New List(Of IList(Of String)) 

その後は、それが暗黙のうちに適切にキャストします。

+0

あなたの答えはまさに私が必要としていたものでした。ジョンはちょうどそれをもっと説明しました。ご協力ありがとうございました。 –

-3

は、次のように変更してみてください。

Public Sub Import(ByVal Rows As List(Of List(Of String))) 
    For Each Row As List(Of String) In Rows 
     ImportRow(Row) 
    Next 
End Sub 

IListListからキャストする必要があるように表示されません。

+0

あなたの熱意をお寄せいただきありがとうございますが、これはテリアンが求めているものにさえ近すぎません。 – ckittel

関連する問題