![]() |
Cast von Nullable<> (Spring4D) nach Variant
Ich habe mich vor den Delphi-Variants immer gedrückt und weiß wenig darüber. Hier, was ich glaube:
Delphi-Quellcode:
liefert ein Variant, das bei seinen Casts immer "Null" zurückgibt. Auf eine Zahl ist es
System.Variants.Null()
Delphi-Quellcode:
, auf einen String ist es ein leerer String, auf eine Referenz ist es
0
Delphi-Quellcode:
usw.
Nil
Dementgegen steht
Delphi-Quellcode:
: Das liefert einen Variant, der nichts ist. Man kann ihn nirgendwo hin casten, es steckt nichts drin.
System.Variants.Unassigned()
Richtig soweit? Wenn ja wundert es mich, warum ein leeres ![]()
Delphi-Quellcode:
zurückgibt und nicht
Null()
Delphi-Quellcode:
.
Unassigned()
Welchen Grund hat das? Hier noch einmal der aktuelle Sourcecode in Spring:
Delphi-Quellcode:
class operator Nullable<T>.Implicit(const value: Nullable<T>): Variant;
var v: TValue; begin if value.HasValue then begin v := TValue.From<T>(value.Value); if v.IsType<Boolean> then Result := v.AsBoolean else Result := v.AsVariant; end else Result := Null; // Warum? end; |
AW: Cast von Nullable<> (Spring4D) nach Variant
'Null' ist einfacher zu handhaben als 'Unassigned'. Aber wissen tut das nur Meister Stevie.
|
AW: Cast von Nullable<> (Spring4D) nach Variant
wenn du einen Variant mit dem Wert Null einem Integer oder einer Stringvariable zuweist, bekommst Du doch nicht 0, bzw. '' sondern eine Exception.
Für mich als Datenbankentwickler ist Null halt "leer". Unassigned kommt in meinen Gedankengängen nicht vor :stupid: Somit kann ich mit der Behandlung, wie es in Spring4D gelöst ist, sehr sehr gut leben. Ich hab (nach dem Vortrag von Stevie am Samstag) meine Anwendung von der Verwendung von Variants auf TNullable umgestellt. Das hat problemlos funktioniert und macht den Code deutlich schöner. |
AW: Cast von Nullable<> (Spring4D) nach Variant
Soweit ich weiß, ist Unassigned eher für OLE Zeugs - siehe auch Dokumentation, die da sagt:
Zitat:
Beim Hineingeben eines Variants sorgen sowohl Null als auch Unassigned (es wird mit VarIsNull or VarIsEmpty geprüft) dafür, dass es ein leerer Nullable<T> ist. Allerdings muss sich beim herausgeben eines Variants für eins von beidem entschieden werden und da macht Null wie zuvor erwähnt eher Sinn. Zitat:
Bei Null gibts einen EVariantTypeCastError. Zitat:
|
AW: Cast von Nullable<> (Spring4D) nach Variant
Soweit ich mich erinnere, kann auf 'v = Null' geprüft werden ('v' ist ein Variant), aber auf 'v = Unassigned' nicht. Es ist also ein netter Nebeneffekt auch in Hinblick auf den Vergleich, das hier 'Null' geliefert wird.
|
AW: Cast von Nullable<> (Spring4D) nach Variant
Zitat:
Delphi-Quellcode:
true ist und sich Unassigned somit nicht als expliziter Zustand für "ist leer" benutzen lässt.
0 = Unassigned
|
AW: Cast von Nullable<> (Spring4D) nach Variant
Zitat:
Mein Szenario war folgendes: Ich habe ein paar Variablen vom Typ
Delphi-Quellcode:
und muss die in einer TQuery in die Parameter (
Nullable<IrgendeinTyp>
Delphi-Quellcode:
) stecken. Ein
Data.DB.TParam
Delphi-Quellcode:
hat eine Property
TParam
Delphi-Quellcode:
vom Typ
Value
Delphi-Quellcode:
. Der Setter dieser Property setzt die TParam-Eigenschaft
Variant
Delphi-Quellcode:
. Bound gibt an, ob der Parameter gesetzt ist.
Bound := VarIsClear(variantDings)
Ja, er ist gesetzt, und zwar auf NULL. Ich habe also, trotz anfänglicher Verwirrung, genau was ich will :-) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz