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

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

Спасибо!


person tmighty    schedule 19.09.2014    source источник
comment
у вас возникли проблемы с использованием внутреннего класса с именем List(Of T)   -  person Ňɏssa Pøngjǣrdenlarp    schedule 20.09.2014
comment
Почему я прошу неприятностей?   -  person tmighty    schedule 23.09.2014


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

person Neolisk    schedule 20.09.2014
comment
Спасибо, по крайней мере, TryCast больше не выдает ошибок. Мне нужно исправить еще несколько ошибок, поэтому я пока не могу его протестировать, но, думаю, он работает. - person tmighty; 20.09.2014