C # Benutzerdefinierter Datentyp! [Duplikat]

8

Nachdem ich beschlossen habe, meinen Int128 in C # zu implementieren, dachte ich, es wäre schön, wenn es so aussehen würde wie andere dotNet Datentypen. Aber ich konnte die folgende Funktion nicht implementieren:

  • Suffix-Initialisierung: wie 13L und 0,2D

Kann ich mein eigenes Suffix in C # erstellen?
Und wenn ich nicht kann .. wie kann ich es initialisieren?
d. h.

%Vor%     
Betamoo 12.05.2010, 14:22
quelle

4 Antworten

8

Sie können keine eigenen Suffix-Initialisierer erstellen - dies ist Teil der Sprache und in den Compiler eingebacken. Wenn Sie Ihren eigenen C # -Compiler schreiben, können Sie andererseits tun, was Sie wollen, und ihn beliebig erweitern.

Wie Sie es initialisieren würden - es hängt davon ab, wie Sie es geschrieben haben. Wenn es sich um eine Klasse handelt, müssen Sie sie mit dem Schlüsselwort new initialisieren oder einige implizite Konvertierungen in numerische Typen mit geringerer Genauigkeit schreiben.

Wie Jon bemerkte, haben Sie keine Möglichkeit, den Wert auf einen Wert größer als ulong.MaxValue zu setzen, ohne dass eine String-Manipulation erforderlich ist. Sie müssen auch intern in irgendeiner Form darstellen (string? Eine Anzahl von ulongs ?) Und sicherstellen, dass alle Konvertierungen und Operationen korrekt funktionieren (was ist mit Überläufen?).

    
Oded 12.05.2010, 14:27
quelle
17

Nein, Sie können in C # kein eigenes Literalformat erstellen.

Sie könnten eine implizite Konvertierung von int , long , uint und ulong haben, was Folgendes erlaubt:

%Vor%

, aber Sie können keine Werte größer als ulong.MaxValue auf diese Weise angeben.

Eine implizite Konvertierung von decimal würde einen größeren Bereich erlauben, wäre aber eine schlechte Idee, weil Sie Daten für jeden Wert verlieren würden, der nicht nur eine Ganzzahl ist.

Grundsätzlich gibt es nichts, was einen literal garantierten Ganzzahlwert größer als ulong.MaxValue erlaubt - Sie könnten eine Zeichenkette analysieren, aber das ist nicht wirklich ideal. Alternativ könnten Sie einen Konstruktor erstellen, der zwei ulongs, einen für die unteren 64 Bits und einen für die oberen 64 Bits, übernimmt.

    
Jon Skeet 12.05.2010 14:25
quelle
1

Nein, Suffix-Initialisierung ist nicht möglich. Dieses bisschen Niedlichkeit wird im bevorstehenden C ++ - Standard verfügbar sein ... aber ich schweife ab.

Die offensichtlichsten Optionen sind Int128(long hi, ulong lo) und Int128(string) .

    
Marcelo Cantos 12.05.2010 14:28
quelle
1

Sie können sich die neue BigInteger-Struktur in 4.0 für Hinweise zur Initialisierung ansehen. Ссылка

    
kicsit 12.05.2010 14:30
quelle

Tags und Links