2008-10-14 4 views
14

Ich habe gerade bemerkt, dass Sie dies in C# tun können:C#: Wie funktioniert das: Unit myUnit = 5;

Unit myUnit = 5; 

statt, dies zu tun mit:

Unit myUnit = new Unit(5); 

Wer weiß, wie ich das mit meinem eigenen structs erreichen kann? Ich habe mir die Unit-Struktur mit Reflector angeschaut und festgestellt, dass das TypeConverter-Attribut verwendet wurde, aber nachdem ich einen benutzerdefinierten TypeConverter für meine Struktur erstellt hatte, konnte ich den Compiler immer noch nicht dazu bringen, diese bequeme Syntax zu erlauben.

Antwort

31

Sie müssen von einem impliziten Konvertierungsoperator zur Verfügung zu stellen int Einheit, etwa so:

public struct Unit 
    { // the conversion operator... 
     public static implicit operator Unit(int value) 
     { 
      return new Unit(value); 
     } 
     // the boring stuff... 
     private readonly int value; 
     public int Value { get { return value; } } 
     public Unit(int value) { this.value = value; } 
    } 
+0

Oooh immer neue Dinge zu lernen - kann nicht glauben, dass ich noch nie zuvor auf – cbp

+0

vorgestoßen bin Es gibt auch eine "explizite" Besetzung - funktioniert gleich, aber der Anrufer muss hinzufügen (Unit); Wird normalerweise verwendet, wenn das Risiko eines Datenverlusts besteht (Genauigkeit/Bereich/Skalierung/etc - zum Beispiel float => int) –

+0

Überladen von Operatoren ist sehr mächtig, aber treten Sie leicht dabei auf: Es ist einfach, Code zu machen, der am Ende ist sehr unvorhersehbar für die Wartungsprogrammierer. Verwenden Sie es, wenn es angemessen ist (z. B. der Fall Unit), aber übertreiben Sie es nicht. (Und immer sicherstellen, dass es gut dokumentiert ist!) –

2

Sie müssen einen Umwandlungsoperator für die Klasse angeben, die ein Int32-Objekt verwendet.

+0

Minor Korrektur: es ist eigentlich ein _conversion_ Operator (siehe 10.10.3 in der MS-spec) –