2010-06-23 4 views
6

Ich erstelle meinen eigenen Typ für die Darstellung von CSS-Werten (wie Pixel zB 12px). Um hinzufügen/subtrahieren/multiplizieren/... meinen Typ und Ints habe ich zwei implizite Operatoren zu und von int definiert. Alles funktioniert gut, außer einer Sache .. Wenn ich schreibe:C# Implizite Operatoren und ToString()

CssUnitBase c1 = 10; 
Console.WriteLine(c1); 

I "10" anstelle von "10px" get - impliziter Konvertierung wird stattdessen toString() -Methode auf int verwendet. Wie kann ich das verhindern?

+0

Können Sie den Code in die 'CssUnitBase' Klasse schreiben? Von der Art, wie Sie es benutzen, scheint es ein Wrapper um int zu sein. – Oded

+0

ut hängt davon ab, wie Sie den Wert in CssUnitBase intern speichern und wie Sie ihn zurückgeben. "Sprechen ist billig, zeigen Sie uns den Code" – vaitrafra

+1

@vaitrafra: Ich sehe nicht, wie es überhaupt darauf ankommt. Es gibt eine implizite Konvertierung in/aus int und eine Überschreibung für ToString. Das sind die Teile der öffentlichen API, die in dieser Frage relevant sind, und ich denke nicht, dass ihre Implementierung überhaupt von Bedeutung ist. Es ist was aufgerufen wird, was relevant ist. –

Antwort

1

Überschreiben Sie die "ToString()" -Methode und verwenden Sie c1.ToString().

12

Ja, es gibt eine implizite Umwandlung zu int und die Überlastung von WriteLine(int) ist spezifischer als WriteLine(object), so wird es verwenden.

Sie könnten explizit Aufruf der WriteLine(object) Überlastung:

Console.WriteLine((object)c1); 

... oder könnten Sie ToString selbst nennen, so dass Console.WriteLine(string) genannt wird:

Console.WriteLine(c1.ToString()); 

... oder Sie könnten Entfernen Sie einfach die implizite Konvertierung in int. Wie nützlich ist es für dich? Ich bin im Allgemeinen nicht für implizite Konvertierungen für diese Art der Sache ... (Man könnte die implizite Konvertierung vonint natürlich halten, wenn Sie wirklich wollte.)

+0

Ich habe das ganz anders gemacht. Implizite Umwandlung in int ist jetzt explizit und ich habe 4 Operatoren (+ - * /) überladen, die auf CssUnitBase operieren. Auf diese Weise habe ich beides - ToString wird standardmäßig aufgerufen und arithmetische Operationen funktionieren gut (mit einer Mischung aus Int- und CssUnitBase-Operanden) ohne viel Code. Alle Operationen wie CssUnitBase * int sollten immer CssUnitBase zurückgeben, so dass dies in jeder Hinsicht so ist, wie ich es möchte. – kubal5003

+0

@ kubal5003: Das hört sich nach dem richtigen Weg an, ja. Schön, dass es für dich geklappt hat. –

1

einfach überschreiben die ToString Methode in CssUnitBase und nenne das, wenn du es als String willst.

+0

Das habe ich schon gemacht! – kubal5003