Böse Falle mit ??-operator

Heute ab ich längere Zeit nach einem Bug gesucht. Der Folgende Code wollte einfach nicht die korrekte Differenz ausrechenen:

  int? geliefert = 3;
  int? aktuell = 2;

  int diff = geliefert??0 - aktuell??0;

Bis ich endlich draufkam, dass das Minus ja nie ausgewertet wird, da einfach der erste Wert zurückgeliefert wird…

Also gut, wieder was gelernt, wenn man den ??-operator verwendet. Hab das ganze in Klammer gepackt, dann ging es wunderbar…

int diff = (geliefert ?? 0) - (aktuell ?? 0);

3 thoughts on “Böse Falle mit ??-operator

  1. Rainer Hilmer

    Da beide Werte null sein dürfen, würde ein falsches Ergebnis geliefert, wenn das für geliefert oder aktuell zutrifft. Wie sicherst du das ab?
    Beide nicht null: 1
    geliefert ist null: -2
    aktuell ist null: 3
    Beide sind null: 0

  2. jkalmbach Post author

    Ich brauch da nix abzusichern, da genau das Ergebnis so gewollt ist, wie Du es beschreibst…
    PS: Die Werte kommen von einer Datenbank-Tabelle, welche über das Entity-Framework (EF4) gefüllt wurde.

  3. Chris

    Genau deshalb sollte man bei solchen Ausdrücken sowieso immer Klammern setzen. Erhöht die Lesbarkeit ungemein, vor allem für Fremdprogrammierer, die nicht jede Operatorpriorität im Kopf haben. Punkt- vor Strichrechnung kann man vielleicht noch durchgehen lassen, aber bei Ausdrücken wie “i < 0 && j” ist Klammerung Pflicht. Und gleiches gilt für den ??-Operator und in vielen Fällen auch für den trinären ?-Operator.

Comments are closed.