2

C# 5.0 仕様は、7.1.3 章で読み取ります

https://msdn.microsoft.com/en-us/library/ms228593.aspx

false一方または両方のオペランドがの場合、持ち上げられた演算子は値を生成しますnull

ただし、テストとこの MSDN リンクも

http://msdn.microsoft.com/en-us/library/2cf62fcy(v=vs.100).aspx

int? num1 = 10;
int? num2 = null;

// Change the value of num1, so that both num1 and num2 are null.
num1 = null;
if (num1 == num2)
{
  // The equality comparison returns true when both operands are null.
  Console.WriteLine("num1 == num2 returns true when the value of each is null");
}

/* Output:
 * num1 == num2 returns true when the value of each is null
 */

nullは、どちらも を返す2 つの null 許容値を比較することを示していますtrue

理にかなっていますが、仕様の文と矛盾していますね。

4

2 に答える 2

5

混同しないでください。これはさまざまなタイプの演算子に関するものです。

• 等値演算子 == != の場合、オペランドの型が両方とも null 非許容の値型であり、結果の型が bool である場合、演算子の持ち上げられた形式が存在します。持ち上げられたフォームは、単一の ? を追加することによって構築されます。各オペランド タイプへの修飾子。持ち上げられた演算子は、2 つの null 値が等しいと見なし、null 値は null 以外の値と等しくないと見なします。両方のオペランドが null でない場合、持ち上げられた演算子はオペランドをアンラップし、基礎となる演算子を適用して bool の結果を生成します。

• 関係演算子 < > <= >= の場合、オペランドの型が両方とも null 非許容値型であり、結果の型が bool である場合、演算子の持ち上げられた形式が存在します。持ち上げられたフォームは、単一の ? を追加することによって構築されます。各オペランド タイプへの修飾子。一方または両方のオペランドが null の場合、持ち上げられた演算子は値 false を生成します。それ以外の場合、持ち上げられた演算子はオペランドをアンラップし、基礎となる演算子を適用して bool の結果を生成します。

于 2016-10-05T12:35:13.000 に答える
4

仕様は後でそれを言う

• 等値演算子 == != の場合、オペランドの型が両方とも null 非許容の値型であり、結果の型が bool である場合、演算子の持ち上げられた形式が存在します。持ち上げられたフォームは、単一の ? を追加することによって構築されます。各オペランド タイプへの修飾子。持ち上げられた演算子は、2 つの null 値が等しいと見なし、null 値は null 以外の値と等しくないと見なします。両方のオペランドが null でない場合、持ち上げられた演算子はオペランドをアンラップし、基礎となる演算子を適用して bool の結果を生成します。

于 2016-10-05T12:34:13.807 に答える