Ошибка 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
(просто объект является предком всех типов, поэтому DirectCast всегда работает с ним). Рассмотрим следующий пример:Dim p As String If TypeOf p Is Integer Then End If
Компилятор будет жаловаться в этом случае:
Выражение типа 'String' никогда не может быть типа 'Integer'.
В вашем случае компилятор не может проверить, всегда ли существует отношение наследования между
T
иclsCell
. В большинстве случаев их не будет, поэтому вы не можете использовать DirectCast.Решением для вас будет использование другого оператора приведения, такого как TryCast, по крайней мере, это не вызовет ошибки времени компиляции. Также лучше, если вы объясните, что вы хотели сделать здесь, потому что
List(Of T)
является стандартным типом в .NET, поэтому создание другого типа хорошо для создания путаницы.Я ожидал бы, что он потерпит неудачу на
TypeOf
линии, хотя, используя ту же логику. Может быть, кто-то на этом можно подробнее остановиться.