2012-11-13 46 views
2

我想在VB.net中創建一個簡單的函數,它將使用TryCast的幾個參數。使用TryCast返回DBNull而不是Nothing

我的目標是讓我可以使用函數來代替TryCast,而不是在返回Nothing時返回DbNull。

我似乎無法得到任何工作,儘管很多搜索。

謝謝。

回答

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本身是一個固定類型,因此不夠靈活。

+0

感謝您的意見。這將解釋爲什麼我無法實現它的工作。 – henda79

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