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である共通の型、つまり両方が継承する型が推定されます。ただし、Nothing
VB に関する限り、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
。