DBNull次のコードを使用して a をチェックし、変数が存在する場合は変数を何も設定せず、そうでない場合は short に設定しようとしています。問題は、変数の設定に失敗し、代わりNothingに aに設定することです。0理由を知っている人はいますか?
variable = If(currentRow.Item("variable") Is DBNull.Value,
Nothing, CShort(currentRow.Item("variable")))
DBNull次のコードを使用して a をチェックし、変数が存在する場合は変数を何も設定せず、そうでない場合は short に設定しようとしています。問題は、変数の設定に失敗し、代わりNothingに aに設定することです。0理由を知っている人はいますか?
variable = If(currentRow.Item("variable") Is DBNull.Value,
Nothing, CShort(currentRow.Item("variable")))
variableが宣言されている場合As Short?、コードはわずかな微調整で機能します。If最初に のいずれかのオペランドをターゲットの型にキャストする必要があります。
variable = If(condition, CType(Nothing, Short?), CShort(…))
(代わりに 3 番目のオペランド、またはその両方をキャストすることもできます。)
このキャストが必要なのは、 がどのようにIf型を推定するかです。2 つの結果の型が一致しない場合、最も近い親 typeである共通の型、つまり両方が継承する型が推定されます。ただし、NothingVB に関する限り、Nothingは既に有効でありShort、デフォルトで初期化されているため、新しいルールが適用されます (説明については、以下の古い回答を参照してください)。したがって、VB は型強制を試みず、単にShort戻り値として使用します。
OPが宣言したと仮定して、以下の古い回答variable As Short:
値のタイプを に設定することはできませんNothing。値の型に割り当てるNothingと、代わりにその型のデフォルト値に設定されます – これ0はShort.
これは簡単にテストできます。
Dim s as Short = Nothing
Console.WriteLine(s)
値の型を に設定することNothingは、その既定のコンストラクター ( New Short()) を呼び出すか、その型の新しい変数を初期化せずに宣言することと同じです。C# での対応する操作は、default(T)( short s = default(short)) を割り当てることです。
null値の型を表現したい場合は、 null 許容型を使用する必要があります。
Dim s as Short? = Nothing
現在sはタイプNullable<Short>(Short?はそのショートカット) であり、適切な を割り当てることができますNothing。