TryCastで使用するためにいくつかのパラメーターを受け取るVB.netで単純な関数を作成しようとしています。
私の目標は、TryCastの代わりに使用できる関数を使用することです。この関数は、失敗したときにNothingを返す代わりに、DbNullを返す必要があります。
多くの検索を行っても、何も機能しないようです。
ありがとう。
TryCastで使用するためにいくつかのパラメーターを受け取るVB.netで単純な関数を作成しようとしています。
私の目標は、TryCastの代わりに使用できる関数を使用することです。この関数は、失敗したときにNothingを返す代わりに、DbNullを返す必要があります。
多くの検索を行っても、何も機能しないようです。
ありがとう。
問題は、関数に特定の戻り値タイプが必要なことです。したがって、次のようなシグネチャを使用して関数を記述できます。
Public Function TryCast(Of T)(ByVal item As Object) As T
ただし、タイプがDBNullになることはないため、希望どおりに実行することはできません(おそらく、発生する可能性がありますが、うまくいけば、アイデアが得られます)。T
言い換えれば、型システムはこれをブロックします。一方では、リターンタイプ(したがってキャスト)について完全に明示的にする必要があります。一方、完全に異なるタイプを返すことができるようにする必要があります。.Netは、動的型付けを使用しても、これを許可しません。メソッドが単一の固定型を返すか、型を返すように宣言されていないかのいずれかです。
Option Explicit
オフにすると、次のようなことができる場合があります。
Public Function TryCast(Of T)(ByVal item As Object)
ただし、戻り値が実質的にオブジェクトと同じになり、キャストのメリットが失われるため、これでも希望どおりの結果が得られるとは思いません。
Nothing
どのタイプにも何も割り当てることができないため、通常のTryCast()で機能します。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
と問題が発生します。に変換できないため、に割り当てることが期待されます(通常は)を返します。代わりに、カスタムクラスのインスタンスにを割り当てることができないため、を取得します。ここで覚えておくべき重要なこと-何にでも割り当てることができ、にのみ割り当てることができます。DBNull継承階層については、ここを参照してください。ccc
C
DBNull
C
C
B
TryCast
Nothing
System.InvalidCastException
DBNull
Nothing
DBNull
Object