2012-07-01 16 views
11

Leí un truco útil sobre cómo evitar el uso de datos de dominio incorrectos en el código creando un tipo de datos para cada tipo de dominio que está utilizando. Al hacer esto, el compilador evitará que mezcle accidentalmente sus tipos.¿Hay alguna manera de construir implícitamente un tipo en C#?

Por ejemplo, la definición de los siguientes:

public struct Meter 
{ 
    public int Value; 

    public Meter(int value) 
    { 
     this.Value = value; 
    } 
} 

public struct Second 
{ 
    public int Value; 

    public Second(int value) 
    { 
     this.Value = value; 
    } 
} 

me permite no mezclo metros y segundo porque son tipos de datos separados. Esto es genial y puedo ver lo útil que puede ser. Soy consciente de que todavía necesitarás definir sobrecargas del operador para manejar cualquier tipo de aritmética con estos tipos, pero lo dejo por simplicidad.

El problema que estoy teniendo con este enfoque es que con el fin de utilizar estos tipos necesito utilizar el constructor completa cada vez, así:

Meter distance = new Meter(5); 

¿Hay alguna forma en C# que puedo usar el mismo modo de construcción que utiliza un System.Int32, así:

Meter distance = 5; 

he intentado crear una conversión implícita, pero parece que esto tendría que ser parte del tipo Int32, no mis tipos personalizados. No puedo agregar un Método de extensión a Int32 porque debería ser estático, ¿hay alguna forma de hacerlo?

+0

¿Qué quiere decir que no puede agregar un método de extensión a 'Int32' porque sería estático? (El objetivo de los métodos de extensión es que operan como si fueran métodos de instancia, lo que es perfectamente aplicable a primitivas como ints.) –

+0

Pensé que necesitaba agregar la conversación de operador implícita como método estático a Int32 pero puede ' t agregar métodos estáticos a los tipos existentes (solo métodos de instancia). De todos modos, Kendal Frey obtuvo la respuesta correcta que estaba buscando. –

+0

Acepto que esa es la respuesta que estabas buscando. Pero todavía no entiendo lo que quiere decir con "métodos estáticos". Los métodos de extensión para todos los intentos y propósitos actúan como métodos de instancia. Entonces, para el debate, 'Meter distance = 5.ToMeter();' hubiera funcionado bien. (aunque acepto que no es tan conciso como las conversiones implícitas) –

Respuesta

24

Puede especificar implicit conversion directamente en las propias estructuras.

public struct Meter 
{ 
    public int Value; 

    public Meter(int value) 
    { 
     this.Value = value; 
    } 

    public static implicit operator Meter(int a) 
    { 
     return new Meter(a); 
    } 
} 

public struct Second 
{ 
    public int Value; 

    public Second(int value) 
    { 
     this.Value = value; 
    } 

    public static implicit operator Second(int a) 
    { 
     return new Second(a); 
    } 
} 
+0

¡Perfecto! Probé un operador implícito como int (Meter m), no sé por qué no lo intenté al revés. Guau. ¡Gracias! –

Cuestiones relacionadas