비교 연산자는 null int와 어떻게 작동합니까?


151

nullable 유형을 배우기 시작하고 다음과 같은 동작이 발생했습니다.

nullable int를 시도하는 동안 비교 연산자가 예기치 않은 결과를 얻습니다. 예를 들어, 아래 코드에서 내가 얻는 결과는 "둘 다 1이 같습니다" 입니다. "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

답변:


207

MSDN 에 따르면 "운영자"섹션의 페이지가 아래에 있습니다.

당신이 nullable 형식과 비교를 수행 할 때 null 허용 유형 중 하나의 값이있는 경우, null다른이 아닌, 모든 비교하는 평가 false를 제외하고!=

그래서 모두 a > ba < b로 평가 false하기 때문에 anull의 ...


2
내 프로젝트에서 나는 현재 VB.NET을 사용하고 있으며이 보인다 nothing <> 1= null반면 VB에서를 null != 1= trueC #에서 - 나는 문 테스트 LinqPad을 사용하고있다
누가 복음 T 오브라이언을

2
방금 궁금한 점이 Lifted Operators있으며 C # stackoverflow.com/questions/3370110/what-are-lifted-operators 에서 주목할 가치 가 있습니다. 이것이 VB.NET이 다른 결과를 반환하는 이유 일지 궁금합니다.
Luke T O'Brien

44

MSDN이 말한 것처럼

널 입력 가능 유형과의 비교를 수행 할 때 널 입력 가능 유형 중 하나의 값이 널이고 다른 값이 아닌 경우! = (같지 않음)을 제외하고 모든 비교는 false로 평가됩니다. 특정 비교가 false를 리턴하므로 반대의 경우는 true를 리턴한다고 가정하지 않아야합니다. 다음 예에서 10은 널보다 크거나 작거나 같지 않습니다. 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

요약 : 널 (null) 어떤 불평등 비교 ( >=, <, <=, >)를 반환 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?
Кое Кто

1
@ КоеКто, 같은 동작은입니다 Nullable<NumberTypes> = null. 확인되었습니다.
Artru

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.