2

我有以下代码:

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)

有人可以告诉我我做错了什么吗?

谢谢!

4

1 回答 1

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使用相同的逻辑在线失败。也许其他人可以详细说明这一点。

于 2014-09-20T00:01:21.360 回答