Ошибка 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 2

1 ответ:

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

Dim p As String
If TypeOf p Is Integer Then

End If

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

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

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

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

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