![]() |
AW: Spring4D: Nullables
Zitat:
Wir machen uns mal Gedanken dazu :gruebel: Eine Möglichkeit, die mir spontan einfällt, wäre den implicit operator für Variant->Nullable<T> auf explicit zu ändern. Dann muss man einen Hardcast schreiben:
Delphi-Quellcode:
P.S. Näää, vergisset, dat geht nich -.- Dann würde bei (*) wieder die Variant to T konvertierung zuschlagen und möglicherweise strings in Integer casten und die in den Nullable packen oder EVariantTypeCastError werfen, wenn null drin steckt. :(
myNullableInteger := 'Wurst'; // kompiliert nicht
myNullableInteger := Nullable<Integer>('Wurst'); // kompiliert aber wie gehabt Exception myNullableInteger := myVariant; // kompiliert nicht mehr - breaking change (*) myNullableInteger := Nullable<Integer>(myVariant); // kompiliert und wie bisher je nachdem, was im Variant drin steckt erfolgreich oder Exception |
AW: Spring4D: Nullables
Ich habe in meiner Bibliothek auch einen Nullable-Typen und da gibt es zusätzlich einen
Delphi-Quellcode:
Dafür habe ich zwar keine Variants-Unterstützung, aber immer eine Typsichere Zuweisung :stupid:
type
Nullable = record const NULL : Nullable; end; type Nullable<T> = record public class operator implicit( const Value : Nullable ): Nullable<T>; end; Hübsch finde ich es auch noch
Delphi-Quellcode:
Hübsch fand ich auch noch die Abkürzungen (damit meine zarten Finger geschont werden :mrgreen:)
var
ni : Nullable<Integer>; begin ni := 5; ni := Nullable.Null; // auf NULL prüfen if ni = Nullable.Null then begin end; // auf NULL prüfen if not ni.HasValue then begin end; end;
Delphi-Quellcode:
NullableInteger = Nullable<Integer>;
NInteger = NullableInteger; |
AW: Spring4D: Nullables
Zitat:
Zitat:
|
AW: Spring4D: Nullables
Zitat:
Zitat:
|
AW: Spring4D: Nullables
Zitat:
Mein Vorschlag
Dann könnte man schreiben
Delphi-Quellcode:
var
myNullableInt: Spring.Nullable<T> ... myNullableInt := myQuery.FieldByName('MY_FELD').AsNullable<Integer>; // alternative Syntax myNullableInt := myQuery.NullableField<Integer>('MY_FELD'); |
AW: Spring4D: Nullables
Ich verstehe eins hierbei noch nicht:
Warum ist denn die Variant-Geschichte eigentlich Implicit und nicht Explicit? Wäre Sie es, kann ich immer noch sagen
Delphi-Quellcode:
oder
myNullableInt := myDatabaseField.Value
Delphi-Quellcode:
myNullableInt := myStrangeVariant
Ich kann allerdings nicht mehr sagen
Delphi-Quellcode:
myNullableInt := myFloatValue
|
AW: Spring4D: Nullables
Wenn also Nullables beliebigen Typs sein können, wieso verwende ich nicht dann einfach Variants?
|
AW: Spring4D: Nullables
Zitat:
Delphi-Quellcode:
soll eben nicht alles beinhalten, sondern typsicher einen Wert vom Typ
Nullable<T>
Delphi-Quellcode:
oder eben nichts.
T
|
AW: Spring4D: Nullables
Zitat:
Also so:
Delphi-Quellcode:
oder
myNullableInt := Nullable<Integer>(myDatabaseField.Value);
Delphi-Quellcode:
myNullableInt := Nullable<Integer>(myStrangeVariant)
|
AW: Spring4D: Nullables
Zitat:
Delphi-Quellcode:
auch einen String zuweisen kann, ohne das es knallt (also eher 'ein bisschen typsicher'). Und das der Wert dann 0 ist.
Nullable<Integer>
Na ja. Ein etwas besseres 'VarToInt' (aka convert) tut's ja auch. Also: Ich weise einem Variant zu, was ich will und erst beim Auslesen interpretiere ich, was da drin steht. Hmm. Vom Verhalten sehe ich jetzt nicht so den Unterschied zu normalen Variants, aber egal. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:51 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