Ошибка 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
линия, хотя, используя ту же логику. Может быть, кто-то еще может уточнить это.