2

DBNull次のコードを使用して a をチェックし、変数が存在する場合は変数を何も設定せず、そうでない場合は short に設定しようとしています。問題は、変数の設定に失敗し、代わりNothingに aに設定することです。0理由を知っている人はいますか?

variable = If(currentRow.Item("variable") Is DBNull.Value,
    Nothing, CShort(currentRow.Item("variable")))
4

1 に答える 1

5

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と、代わりにその型のデフォルト値に設定されます – これ0Short.

これは簡単にテストできます。

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

于 2012-11-08T20:14:07.450 に答える