我正在尝试在VB.net中创建一个简单的函数,它将使用一些参数与TryCast一起使用。
我的目标是拥有一个可以代替TryCast使用的函数,而不是在失败时返回Nothing它应该返回DbNull。
尽管经过多次搜索,我似乎无法得到任何工作。
感谢。
答案 0 :(得分:1)
问题是您必须为您的函数设置一些特定的返回类型。所以你可以用这样的签名编写一个函数:
Public Function TryCast(Of T)(ByVal item As Object) As T
但是你永远不会能够让它做你想做的事,因为T
的类型从不将成为DBNull(好吧,也许,也许可以发生,但希望你能得到这个想法。)
换句话说,类型系统会阻止它。一方面,您希望完全明确返回类型(因此,转换)。另一方面,您希望能够返回完全不同的类型。即使使用动态类型,.Net也不允许这样做。方法返回单个固定类型,或者未声明它返回类型。
关闭Option Explicit
后,您可以选择以下内容:
Public Function TryCast(Of T)(ByVal item As Object)
但是,我不认为这会做你想要的,因为现在返回的值实际上与对象相同,并且你失去了任何转换的好处。
它适用于Nothing
的普通TryCast(),因为Nothing不能分配给任何类型。 DBNull本身就是一个固定类型,因此不够灵活。
答案 1 :(得分:0)
简单回答 - 不可能,这就是原因。假设您有以下代码:
Class A
End Class
Class B : Inherits A
End Class
Class C
End Class
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
Dim aaa As A = MyTryCast(Of A)(New B)
Dim ccc As C = MyTryCast(Of B)(New C)
End Sub
Private Function MyTryCast(Of T As Class)(obj As Object) As Object
Dim result As Object = TryCast(obj, T)
If result Is Nothing Then Return Convert.DBNull
Return result
End Function
MyTryCast
完全符合您的要求,因此aaa
分配有效。将DBNull
分配给ccc
类型C
变量时,会出现问题。您希望它将DBNull
分配给C
,因为C
无法转换为B
(常规TryCast
会返回Nothing
)。相反,您得到System.InvalidCastException
,因为您无法将DBNull
分配给自定义类的实例。要记住的重要事项 - Nothing
可以分配给任何内容,DBNull
只能分配给Object
。请参阅here for DBNull inheritance hierarchy。