次のステートメントを検討してください。
int? v1 = null;
int? v2 = 5 * v1;
の値は v2
? (null
または空の文字列?)
コンパイラが無効な操作としてマークするのを防ぐにはどうすればよいですか? カスタム例外処理に従う必要がありますか?
次のステートメントを検討してください。
int? v1 = null;
int? v2 = 5 * v1;
の値は v2
? (null
または空の文字列?)
コンパイラが無効な操作としてマークするのを防ぐにはどうすればよいですか? カスタム例外処理に従う必要がありますか?
ですnull
。
C# 言語仕様 3.0 (セクション §7.2.7: 持ち上げられた演算子)
二項演算子の場合
+
-
*
/
%
&
|
^
<<
>>
:オペランドと結果の型がすべて null 非許容値型である場合、演算子の持ち上げられた形式が存在します。
?
持ち上げられた形式は、各オペランドと結果の型に単一の修飾子を追加することによって構築されます。持ち上げられた演算子は、null
一方または両方のオペランドがnull
( §7.10.3 で説明されているように、型の&
and|
演算子は例外です) である場合に値を生成します。bool?
それ以外の場合、リフトされた演算子はオペランドをアンラップし、基になる演算子を適用して、結果をラップします。
コンパイラが無効な操作としてマークするのを防ぐにはどうすればよいですか? カスタム例外処理に従う必要がありますか?
無効な操作ではありません。例外はスローされないため、この場合は例外を処理する必要はありません。
コンパイラによって操作が防止されるようにする場合は、2 番目の変数を null 非許容にします。次に、次のように書く必要があります。
int v2 = 5 * v1.Value;
v1 が null の場合、実行時に例外がスローされます。
その値は「null」になります。このコンテキストでは、少なくともデータベースの null と同じであると見なすことができます。つまり、Nothing または Zero ではなく、「Unknown」を意味します。文字列ではなく数字を扱っているため、「空の文字列」になることはありません。
「コンパイラが無効な操作としてマークするのを防ぐにはどうすればよいですか?」の意味がわかりません。このコードは、Visual Studio 2008 でコンパイルして正常に実行されるため =)
何をしようとしているのかわかりませんが、v1 が null の場合に v2 を null にしたい場合は、使用する前に v1 に値があるかどうかをテストする必要があります。
int? v2 = v1.HasValue ? 5 * v1.Value : null;
また
int? v2 = null;
if (v1.HasValue) { v2 = 5 * v1.Value; }