使用TryCast返回DBNull而不是Nothing

时间:2012-11-13 00:08:10

标签: vb.net

我正在尝试在VB.net中创建一个简单的函数,它将使用一些参数与TryCast一起使用。

我的目标是拥有一个可以代替TryCast使用的函数,而不是在失败时返回Nothing它应该返回DbNull。

尽管经过多次搜索,我似乎无法得到任何工作。

感谢。

2 个答案:

答案 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