比較演算子はnull intでどのように機能しますか?


151

私はnull許容型を学習し始め、次の動作に遭遇しました。

null可能なintを試しているときに、比較演算子が予期しない結果を返すことがわかりました。たとえば、次のコードでは、私が取得する出力は"both and 1 is equal"です。「null」も出力しないことに注意してください。

int? a = null;
int? b = 1;

if (a < b)
    Console.WriteLine("{0} is bigger than {1}", b, a);
else if (a > b)
    Console.WriteLine("{0} is bigger than {1}", a, b);
else
    Console.WriteLine("both {0} and {1} are equal", a, b);

負でない整数がnullより大きくなることを期待していました。ここに何か不足していますか?


5
これは、いくつかのケースを確認するための小さな.NET Fiddleです。
Uwe Keim 2017

回答:


207

MSDNによれば、それは「オペレーター」セクションのページにあります:

null許容型との比較を実行するとき、null許容型の一方の値がでnull他方がそうでない場合、すべての比較はfalse!=

したがって、両方a > bとnullがa < b評価されるfalseのでanullです...


2
私のプロジェクトでは現在VB.NETを使用していますが、nothing <> 1= nullVBではnull != 1= に対してtrueC#では-LinqPadを使用してステートメントをテストしています
Luke T O'Brien

2
私は疑問に思い、そしてそれの価値は約注目にLifted OperatorsC#の中でstackoverflow.com/questions/3370110/what-are-lifted-operators -これはVB.NET戻っ異なる結果の理由かもしれない場合、私は疑問に思った
ルークTオブライエン

44

MSDNが言うように

null許容型との比較を実行する場合、null許容型の一方の値がnullで、もう一方がnullでない場合、!=(等しくない)を除いて、すべての比較はfalseと評価されます。特定の比較ではfalseが返されるため、逆のケースではtrueが返されると想定しないことが重要です。次の例では、10はnull以下です。num1!= num2のみがtrueと評価されます。

int? num1 = 10;
int? num2 = null;
if (num1 >= num2)
{
    Console.WriteLine("num1 is greater than or equal to num2");
}
else
{
    // This clause is selected, but num1 is not less than num2.
    Console.WriteLine("num1 >= num2 returned false (but num1 < num2 also is false)");
}

if (num1 < num2)
{
    Console.WriteLine("num1 is less than num2");
}
else
{
    // The else clause is selected again, but num1 is not greater than 
    // or equal to num2.
    Console.WriteLine("num1 < num2 returned false (but num1 >= num2 also is false)");
}

if (num1 != num2)
{
    // This comparison is true, num1 and num2 are not equal.
    Console.WriteLine("Finally, num1 != num2 returns true!");
}

// 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 returned false (but num1 < num2 also is false)
 * num1 < num2 returned false (but num1 >= num2 also is false)
 * Finally, num1 != num2 returns true!
 * num1 == num2 returns true when the value of each is null
 */

25

要約すると:ヌルを有する任意の不等比較を(>=<<=>)を返しfalse、両方のオペランドがNULLであっても。すなわち

null >  anyValue //false
null <= null     //false

null(==!=)を使用した等価または非等価の比較は、「期待どおり」に機能します。すなわち

null == null     //true
null != null     //false
null == nonNull  //false
null != nonNull  //true

それはどちらも同じですint? nonNullし、int notNull
–КоеКто2018

1
@КоеКто、同じ振る舞いはのものですNullable<NumberTypes> = null。確認済み。
Artru

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.