我有以下代码:
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)有人能告诉我我做错了什么吗?
谢谢!
发布于 2014-09-20 00:01:21
我认为这里的问题是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行上失败。也许其他人可以详细说明这一点。
https://stackoverflow.com/questions/25943681
复制相似问题