Null sammenligning i C sharp

#state/evergreen

Se på denne kodesnutten. Hva tror du den printer ut?

var lessThanOrEqual = null <= null;
var equal = null == null;

Console.WriteLine(lessThanOrEqual);
Console.WriteLine(equal);

Jeg hadde gjettet to true verdier. Men det resulterer ganske overraskende i

> False
> True

Hvorfor er det slik?

Fordi spesifikasjon sier det

https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/expressions#1248-lifted-operators

CleanShot 2023-11-13 at 15.02.58@2x.png
Når eksempelvis to inter blir sammenlignet, og de kan være null, så brukes det som kalles "Lifted operators". Da er det definert i C# sin spesifikasjon at to null verdier returnerer false for <, >, <= og >=.

Men hvorfor er det spesifisert slik

Intuitivt så føles det ut som om dersom a==b er sann så må også nødvendigvis a>=b alltid være sann. Men om man går det litt nøyere i sømmene, så gir det mening at null behandles noe annerledes.

Null representerer mangel på data. Man kan si at mangel på data ett sted er det samme som mangel på data et annet sted, eller mangelpådata == mangelpådata. Men å påstå at den ene er like stor eller større enn den andre har vi ikke nok data til å kunne påstå.

Se på følgende eksempel, hvor vi henter karakterer for to personer, Arne og Per, og anta at vi ikke klarer å hente karakterer for noen av dem; vi får tilbake null.

static Dictionary<string, int> karakterer = new ();
static int? FinnKarakterFor(string person)
{
    int karakter;
    if (karakterer.TryGetValue(person, out karakter))
    {
        return karakter;
    }
    else
    {
        return null;
    }
}

static void Main(string[] args)
{
    var arnesKarakter = FinnKarakterFor("Arne");
    var persKarakter = FinnKarakterFor("Per");
    if (arnesKarakter <= persKarakter)
    {
        Console.WriteLine("Pers prestasjon er minst like god som Arnes!");
    }
}

Dersom begge her er null, skal programmet konkludere med at Pers prestasjon er minst like god som Arne? Nei. Vi har ikke nok informasjon til å verken avkrefte eller bekrefte påstanden.

Kilder

https://viktorpeller.com/2014/04/11/nullltenull/