我想在VB.net中創建一個簡單的函數,它將使用TryCast的幾個參數。使用TryCast返回DBNull而不是Nothing
我的目標是讓我可以使用函數來代替TryCast,而不是在返回Nothing時返回DbNull。
我似乎無法得到任何工作,儘管很多搜索。
謝謝。
我想在VB.net中創建一個簡單的函數,它將使用TryCast的幾個參數。使用TryCast返回DBNull而不是Nothing
我的目標是讓我可以使用函數來代替TryCast,而不是在返回Nothing時返回DbNull。
我似乎無法得到任何工作,儘管很多搜索。
謝謝。
問題是你必須爲你的函數有一些特定的返回類型。所以,你可以寫一個函數,像這樣的簽名:
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本身是一個固定類型,因此不夠靈活。
簡單的答案 - 不可能的,這就是爲什麼。假設你有下面的代碼:
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。
感謝您的意見。這將解釋爲什麼我無法實現它的工作。 – henda79