web-dev-qa-db-ja.com

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

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

Nullable intを試しているときに、比較演算子で予期しない結果が得られることがわかります。たとえば、以下の私のコードでは、i getの出力は"1と2が等しい"です。なお、「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よりも大きいことを望んでいました、ここに何かが欠けていますか?

123
Ron5504

MSDN によると、「演算子」セクションのページの下にあります。

NULL可能型と比較を実行するときに、NULL可能型の一方の値がnullであり、他方がそうでない場合、!=を除くすべての比較はfalseに評価されます。

falseはnullなので、a > ba < bの両方がaと評価されます...

178
nkvu

MSDNが言うように

Nullable型との比較を実行するときに、nullable型の一方の値が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
 */
36
PaRiMaL RaJ

要約すると、NULL(>=<<=>)との不等式比較は、両方のオペランドがNULLであってもfalseを返します。つまり.

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

Null(==!=)との同等または非同等の比較は、「期待どおり」に機能します。つまり.

null == null     //true
null != null     //false
null == nonNull  //false
null != nonNull  //true
23
GDS