Ошибка DirectCast

У меня есть следующий код:

Imports System.Collections.ObjectModel

Public Class clsCellListExtender

    Public Class List(Of T)
        Inherits Collection(Of T)

        Private _iID As Integer = 0

        Protected Overrides Sub InsertItem(index As Integer, item As T)
            'your checks here

            If TypeOf (item) Is clsCell Then
                _iID += 1
                Dim nCell As clsCell = DirectCast(item, clsCell)
                nCell.TempID = _iID
            End If

            MyBase.InsertItem(index, item)
        End Sub

    End Class

End Class

Когда я пытаюсь скомпилировать его, компилятор говорит мне, что "T не может быть преобразовано в clsCell" в строке

Dim nCell As clsCell = DirectCast(item, clsCell)

Может кто-нибудь сказать, пожалуйста, что я сделал не так?

Спасибо!

1 ответ

Решение

Я думаю, что проблема здесь в том, что T не ограничивается объектом. Вам нужно что-то, чтобы быть объектом или фактически любым предком clsCell класс (просто Object является предком всех типов, поэтому DirectCast всегда работает с ним). Рассмотрим следующий пример:

Dim p As String
If TypeOf p Is Integer Then

End If

Компилятор будет жаловаться в этом случае:

Выражение типа String никогда не может иметь тип Integer.

В вашем случае компилятор не может проверить, всегда ли существуют отношения наследования между T а также clsCell, В большинстве случаев они не будут единичными, поэтому вы не можете использовать DirectCast.

Решение для вас будет использовать другой оператор приведения, такой как TryCast, по крайней мере, он не вызывает ошибку времени компиляции. Также лучше, если вы объяснили, что вы хотели сделать здесь, потому что List(Of T) это стандартный тип в.NET, поэтому создание другого хорошо для создания путаницы.

Я ожидаю, что это потерпит неудачу на TypeOf линия, хотя, используя ту же логику. Может быть, кто-то еще может уточнить это.

Другие вопросы по тегам