1. ホーム
  2. c#

[解決済み] Nullable<int>のインクリメントはなぜ例外を投げないのですか?

2023-02-16 18:19:32

質問

Console.WriteLineが空の行を書き込むのはなぜか、説明してください。 Console.WriteLine(null) は私にコンパイルエラーを与えます)、なぜNullReferenceExceptionがないのか(さらに a+=1 はそれを発生させないはずです)?

int? a = null;
a++; // Why there is not NullReferenceException? 
Console.WriteLine(a); // Empty line

どのように解決するのですか?

の効果を観察しているのですね。 持ち上げられた演算子 .

C# 5仕様の7.3.7項より。

持ち上げられた演算子は、非ヌル値の型を操作する定義済みおよびユーザー定義の演算子が、それらの型のヌル可能な形式でも使用できるようにします。持ち上げられた演算子は、以下に説明するように、特定の要件を満たす定義済み演算子およびユーザー定義演算子から構築されます。

  • 単項演算子については + ++ - -- ! ~ の場合、オペランドと結果の型が共に非ヌルであれば、演算子のリフトされた形式が存在します。リフトされた形式は、単一の ? 修飾子を追加することで構築されます。リフトされた演算子は、オペランドがNULLの場合、NULL値を生成する。それ以外の場合は、オペランドのラップを解除し、基礎となる演算子を適用し、結果をラップします。

つまり、基本的には a++ という結果を持つ式です。 null (として int? のように)、変数はそのままになります。

を呼び出すと

Console.WriteLine(a);

に囲まれている object で、NULL参照に変換され、空行として出力されます。