2010-06-23 15 views
6

Tworzę własny typ do reprezentowania wartości css (np. Pikseli np. 12 pikseli). Aby móc dodawać/odejmować/mnożyć/... mój typ i int, zdefiniowałem dwóch niejawnych operatorów zi do int. Wszystko działa świetnie z wyjątkiem jednej rzeczy .. Jeśli piszę:C# Operatory niejawne i ToString()

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

uzyskać „10” zamiast „10px” - niejawna konwersja na int jest używany zamiast metody toString(). Jak mogę temu zapobiec?

+0

Czy możesz wysłać kod do klasy 'CssUnitBase'? Od sposobu, w jaki go używasz, wydaje się być owijką wokół int. – Oded

+0

ut opisuje sposób przechowywania wewnętrznej wartości CssUnitBase i sposobu jej zwrócenia. "Talk jest tani, pokaż nam kod" – vaitrafra

+1

@vaitrafra: Nie widzę, jak to w ogóle zależy. Istnieje niejawna konwersja do/z int i przesłonięcie dla ToString. To są fragmenty publicznego interfejsu API, które są istotne w tym pytaniu i nie sądzę, aby ich implementacja w ogóle miała znaczenie. To, co się nazywa, jest istotne. –

Odpowiedz

1

Zastąpić metodę "ToString()" i użyć c1.ToString().

12

Tak, istnieje niejawna konwersja na int, a przeciążenie WriteLine(int) jest bardziej szczegółowe niż WriteLine(object), więc będzie z tego korzystać.

Mogłabyś wyraźnie zadzwoń WriteLine(object) przeciążenie:

Console.WriteLine((object)c1); 

... czy można nazwać ToString siebie, tak że Console.WriteLine(string) nazywa się:

Console.WriteLine(c1.ToString()); 

... czy mógłbyś po prostu usuń niejawną konwersję na int. Jak użyteczne jest to dla ciebie? Jestem ogólnie nie za konwersje niejawne dla tego typu rzeczy ... (Można zachować niejawna konwersja zint oczywiście, jeśli naprawdę chce.)

+0

Zrobiłem to w zupełnie inny sposób. Domyślna konwersja do int jest teraz jawna i mam przeciążonych 4 operatory (+ - * /), które działają na CssUnitBase. W ten sposób mam domyślnie wywoływane - ToString, a operacje arytmetyczne działają dobrze (w przypadku kombinacji operandów int i CssUnitBase) bez większego kodu. Wszystkie operacje, takie jak CssUnitBase * int powinny zawsze zwracać CssUnitBase, więc jest to pod każdym względem tak, jak chcę. – kubal5003

+0

@ kubal5003: To brzmi jak właściwy sposób robienia rzeczy, tak. Cieszę się, że się udało. –

1

Wystarczy zastąpić metodę ToString w CssUnitBase i wywołaj to, gdy chcesz go jako ciąg.

+0

Już to zrobiłem! – kubal5003