Guido, ich weiss nicht, was Du mir beweisen oder erklären willst. Ich weiss sehr wohl, was Variants sind, wie sie definiert sind und wo der Unterschied zwischen einem 'unassigned' und einem 'null' Wert sind. Steht ja auch so im Sourcecode von Variants.pas.
Ich kann auch Variants vergleichen, die mit unterschiedlichen Datentypen gefüllt sind, sofern der stärkere Datentyp in den Schwächeren konvertiert werden kann. Soviel zu deinen Erklärungsversuchen, das man Äpfel nicht mit Essenfassen vergleichen kann. Kann man aber schon, wenn Äpfel und Essenfassen kompatible Variants.
Es ist und bleibt ein Bug. Damit ist für mich die Sache erledigt, auch wenn in der
OH steht, das man mit Unassigned nicht vergleichen kann. Es ist sogesehen kein Bug im herkömmlichen Sinne, aber wenn man Variants als polymorphen Datentyp mit einer derartiken Einschränkung der Allgemeingültigkeit implementiert, kann man seinen Code nicht deterministisch schreiben. Wenn ich auf Gleichheit prüfe, und gar nicht weiss, ob das ein Variant noch unassigned ist, dann ist das Ergebnis u.U. falsch, denn wenn v1=0 (oder '', 0.0 '31.12.1899' etc.) ist, ergibt ein Vergleich mit v2 auch dann TRUE, wenn der v2 noch nichts zugewiesen wurde. Und das ist definitiv falsch. (int)0 ist nun mal nicht identisch mit einem noch nicht zugewiesenen Wert.
Unassigned ist sehr wohl ein eindeutiger Zustand eines Variants (varType = varEmpty, alle Felder = 0). Es wäre sehr wohl möglich, diesen Zustand mit anderen Zuständen zu vergleichen, aber der Code(Variants.pas) ignoriert den varType einfach und vergleicht nur die
Werte der beiden Variants. Und das ist nunmal definitiv und 100% eindeutig unwiderlegbar beweisbar f.a.l.s.c.h.
Zitat von
Guido Eisenbeis:
Hier liegt evtl. der Denkfehler. Sieh dir doch mal die Deklaration an. "Unassigned" bezeichnet nicht, sondern weist zu.
Nein. Weise einer Variable 'Unassigned' zu und gehe im Debugger mit dem Cursor rauf. Was siehst Du? Im englischen Delphi sehe ich 'Unassigned'
Zitat von
Guido Eisenbeis:
Hinzu kommt, dass in Delphi boolsche Bedingungen mit 0 für false und alles andere für true gehandhabt wird. Das heißt, wenn deine if-Abfrage etwas anderes als 0 ergibt, wird es als true interpretiert.
Hat doch gar nichts mit meinem Problem zu tun.
Zitat:
Was ist BS?
BullShit.
Zitat:
Die
MSDN schreibt da seitenweise Definitionen ...
Ich programmiere in Delphi, nicht in
MSDN.
Zitat:
Wie will man nun zwei Variants mit einander vergleichen?
Steht in Variants.Pas.
Über deinen Pointer-Vergleich decke ich den Mantel der Nächstenliebe (oder des Unverständnisses, denn ich weiss nicht, was Du mir klarmachen willst).