2016-10-05 4 views
2

C#5.0仕様は、一または両方オペランドがnullある場合持ち上げオペレータが値falseを生成章7.1.3比較する2つのヌルnullables

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

を読み出します。

しかしテストし、この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戻りtrue二つnull許容値を比較することを示しています。

それは意味がありますが、仕様から文に矛盾していますか?

+0

これは7.3.7章にあります。これは '2項演算子'のためのものです。次のセクションでは、 '=='を含む ''等価演算子 'について説明します。 – Gavin

+1

[Null条件演算子はboolではなくboolに評価されますか?期待どおり](http:// stackoverflow。com/questions/37277102/null-conditional-operator-bool-to-boolを期待どおりに評価する) –

答えて

5

これは混同しないでください。これは、異なるタイプの演算子です。オペランドの型がnull非許容値型の両方である場合、結果タイプがブールの場合は等価演算子については

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

•関係演算子についてオペレータの <> < => = 持ち上げフォームが存在します。持ち上げられたフォームは、単一の?修飾子を各オペランドの型に追加します。 持ち上げられた演算子は、一方または両方のオペランドがNULLであれば、値falseを生成します。さもなければ、持ち上げられたオペレータはオペランドをアンラップし、基礎となるオペレータを適用してブール結果を生成する。

+0

ありがとう。あまり目に見えない... –

3

スペックは後でオペランドの型がnull非許容値型の両方である場合、結果タイプがブールの場合は等価演算子については

• ==!=演算子の持ち上げられた形が存在すること。と言います 解除されたフォームは、1つの?修飾子はそれぞれ オペランドタイプに対応します。 持ち上げられた演算子は、2つのヌル値が等しいとみなし、 は、ヌル値がヌル以外の値と等しくないと見なします。両方のオペランドが でない場合、持ち上げられたオペレータはオペランドをアンラップし、 の基本演算子を適用してブール結果を生成します。

+0

ああ、あなたは最初のものだった、あなたが勝った:D – tym32167

+0

ありがとう。見えないほど盲目。 –