case kann grundsätzlich nur
konstante Ordinalwerte benutzen. Und der Grund wird klar, wenn man sich den erzeugten Code ansieht:
Delphi-Quellcode:
var
i: Integer;
begin
i := 1;
case i of
2: ShowMessage('2');
3: ShowMessage('3');
else
ShowMessage('nix davon');
end;
end;
Das erzeugt den im Anhang gezeigten Code. Da sieht man sehr schön, wie raffiniert der Compiler vorgeht: Er schreibt zunächst unser i in das Register EAX. Dann zieht er 2 davon ab. Nun prüft er, ob EAX gleich 0 ist, was der Fall gewesen wäre, wenn i=2 wäre. Nun zieht er noch eins und prüft wieder auf 0 (entspricht case 3). Ist bis hierher immer noch kein Sprung erfolgt, kommt ein unbedingter Sprung zur Anzeige von 'nix davon'.
Mit nicht konstanten Werten (geschweige denn mit Strings) wäre solch optimiertes Verhalten nicht möglich.
Und soweit ich weiß, machen das andere Sprachen wie C(++) oder Java auch nicht anders.