Можно ли использовать IList (Of IList (Of String))? - PullRequest
1 голос
/ 02 августа 2011

Я пытаюсь использовать переменную, которая является просто списком списка строк. Я объявил это следующим образом:

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

Итак, нельзя ли использовать дженерики с интерфейсами таким образом? Работает нормально, пока я их не вкладываю.

Ответы [ 3 ]

5 голосов
/ 02 августа 2011

Да, можно создать IList(Of IList(Of String)), но List(Of (List(Of String)) не . Учтите, что в последнем случае вы можете позвонить

listOfLists.Add(arrayOfStrings)

как строковый массив реализует IList(Of String).

По сути это то же самое, что и IList(Of Fruit) и List(Of Banana) - гроздь бананов - это не ваза с фруктами, потому что вы не можете добавить в нее яблоко.

В вашем случае вам нужно создать List(Of IList(Of String)) вместо - или , объявить IList(Of List(Of String)).

Что интересно, вы могли бы использовать List(Of List(Of String)) в качестве IEnumerable(Of IEnumerable(Of String)) в .NET 4 из-за общей ковариации и контравариантности - IEnumerable(Of T) ковариантно в T , Однако IList(Of T) является инвариантом .

Общая ковариация и контравариантность - сложная тема. Эрик Липперт написал много об этом - используя C # в качестве языка, а не VB, но, надеюсь, вы все еще можете это понять.

2 голосов
/ 02 августа 2011

Начните с объявления iRows следующим образом:

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

Затем, когда вы добавляете new List(Of String) к iRows, он будет неявно кастоваться соответствующим образом.

0 голосов
/ 02 августа 2011

Попробуйте следующее изменение:

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

Кажется, что нет необходимости разыгрывать от List до IList.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...