2008-10-14 8 views
14

Acabo de notar que se puede hacer esto en C#:C#: ¿Cómo funciona esto ?: Unidad myUnit = 5;

Unit myUnit = 5; 

en lugar de tener que hacer esto:

Unit myUnit = new Unit(5); 

¿Alguien sabe cómo puedo lograr esto con mis propias estructuras? Eché un vistazo a la estructura Unit con reflector y me di cuenta de que se estaba utilizando el atributo TypeConverter, pero después de crear un TypeConverter personalizado para mi estructura, no pude conseguir que el compilador permitiera esta conveniente sintaxis.

Respuesta

31

es necesario proporcionar un operador de conversión implícita de int a la unidad, así:

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 siempre cosas nuevas para aprender - no puedo creer que nunca me he encontrado con esto antes de – cbp

+0

También hay un elenco "explícito" - funciona igual, pero la persona que llama debe agregar (Unidad); generalmente se usa cuando hay un riesgo de pérdida de datos (precisión/rango/escala/etc. - por ejemplo float => int) –

+0

Los operadores de sobrecarga son muy potentes, pero pise ligeramente cuando lo haga: es fácil hacer código que termine siendo muy impredecible para los programadores de mantenimiento. Úselo cuando sea apropiado (como en el caso de la Unidad), pero no se exceda. (¡Y siempre asegúrese de que esté bien documentado!) –

2

Debe proporcionar un operador de conversión para la clase que toma un Int32.

+0

pequeña corrección: en realidad es un operador de _conversion_ (ver 10.10.3 en la especificación MS) –