2010-06-23 23 views
6

Estoy creando mi propio tipo para representar valores CSS (como píxeles, por ejemplo, 12 px). Para poder sumar/restar/multiplicar/... mi tipo y datos he definido dos operadores implícitos ay desde int. Todo funciona muy bien excepto una cosa .. Si escribo:C# Operadores implícitos y ToString()

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

consigo "10" en lugar de "10px" - conversión implícita a int se utiliza en lugar método toString(). ¿Cómo puedo prevenir eso?

+0

¿Se puede publicar el código en la clase 'CssUnitBase'? Por la forma en que lo usas parece _be_ un envoltorio alrededor de int. – Oded

+0

ut depende de cómo almacena internamente el valor en CssUnitBase y cómo lo devuelve. "Hablar es barato, muéstranos el código" – vaitrafra

+1

@vaitrafra: No veo cómo depende de eso en absoluto. Hay una conversión implícita a/desde int, y una modificación para ToString. Esos son los bits de la API pública que son relevantes en esta pregunta, y no creo que su implementación importe en absoluto. Es lo que se llama lo que es relevante. –

Respuesta

1

Reemplace el método "ToString()" y use c1.ToString().

12

Sí, hay una conversión implícita a int y la sobrecarga de WriteLine(int) es más específica que WriteLine(object), por lo que la usará.

Usted podría explícitamente llamada la sobrecarga WriteLine(object):

Console.WriteLine((object)c1); 

... o usted podría llamar ToString a sí mismo, por lo que se llama Console.WriteLine(string):

Console.WriteLine(c1.ToString()); 

... o usted podría simplemente elimine la conversión implícita a int. ¿Qué tan útil es para ti? En general estoy no a favor de las conversiones implícitas para este tipo de cosas ... (Se podría mantener la conversión implícita de int por supuesto, si realmente quería.)

+0

Lo he hecho de otra manera. La conversión implícita a int ahora es explícita y tengo 4 operadores (+ - * /) sobrecargados que operan en CssUnitBase. De esta manera tengo ambos: ToString se llama por defecto y las operaciones aritméticas funcionan bien (en la mezcla de int y operandos CssUnitBase) sin mucho código. Todas las operaciones como CssUnitBase * int siempre deben devolver CssUnitBase, por lo que esto es en todos los aspectos de la forma que lo desee. – kubal5003

+0

@ kubal5003: Eso suena como la forma correcta de hacer las cosas, sí. Me alegro que funcionó para usted. –

1

Sólo reemplazar el método ToString en CssUnitBase y llámalo cuando lo quieras como una cadena.

+0

¡Ya lo hice! – kubal5003

Cuestiones relacionadas