Karşılaştırma operatörü null int ile nasıl çalışır?


160

Null yapılabilir türleri öğrenmeye başladım ve aşağıdaki davranışla karşılaştım.

Null yapılabilir int'i denerken, karşılaştırma operatörünün bana beklenmedik sonuç verdiğini görüyorum. Örneğin, aşağıdaki kodumda, aldığım çıktı "her ikisi ve 1 eşittir" dir . Unutmayın, "boş" da yazmaz.

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);

Negatif olmayan herhangi bir tamsayının boş değerden büyük olacağını umuyordum, Burada bir şey mi eksik?


5
İşte birkaç durumu görmek için küçük bir .NET Fiddle .
Uwe Keim

Yanıtlar:


219

MSDN'ye göre - "Operatörler" bölümünde sayfanın aşağısında:

Null yapılabilir türlerle karşılaştırmalar gerçekleştirdiğinizde, null atanabilir türlerden birinin değeri nullve diğerinin değeri değilse, tüm karşılaştırmalar şu şekilde değerlendirilir false:!=

Yani hem a > bve a < bdeğerlendirmek falseberi aboş ...


2
Projelerimde şu anda VB.NET kullanıyorum ve öyle görünüyor ki nothing <> 1= nullVB'de oysa null != 1= trueC # - İfadeleri test etmek için LinqPad kullanıyorum
Luke T O'Brien

2
Merak ettim ve Lifted OperatorsC # stackoverflow.com/questions/3370110/what-are-lifted-operators'da kayda değer bir şey var - VB.NET'in farklı sonuçlar döndürmesinin nedeni bu olabilir mi diye merak ettim
Luke T O'Brien

48

MSDN'nin dediği gibi

Null yapılabilir türlerle karşılaştırmalar gerçekleştirdiğinizde, null yapılabilir türlerden birinin değeri null ise ve diğeri değilse, tüm karşılaştırmalar! = (Eşit değil) dışında yanlış olarak değerlendirilir. Belirli bir karşılaştırmanın yanlış döndürdüğünü, tersinin doğru döndürdüğünü varsaymamak önemlidir. Aşağıdaki örnekte, 10, null değerinden büyük, küçük veya eşit değildir. Yalnızca num1! = Num2 doğru olarak değerlendirilir.

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
 */

29

Özetlemek gerekirse: Boş ile herhangi eşitsizlik karşılaştırma ( >=, <, <=, >) döndüren falseher iki işlenen boş bile olsa. yani

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

Null ( ==, !=) ile herhangi bir eşitlik veya eşitlik dışı karşılaştırma 'beklendiği gibi' çalışır. yani

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

O ikisi için de aynı mı int? nonNullve int notNull?
Кое Кто

1
@ КоеКто, Aynı davranış içindir Nullable<NumberTypes> = null. Doğrulandı.
Artru

2

C # ile SQL karşılaştırması

C #: a = null ve b = null => a == b => true

SQL: a = null ve b = null => a == b => false

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.