2010-04-28 31 views
11

tengo (por ejemplo) un objeto de tipo A que quiero ser capaz de lanzar a los tipos B (similar a cómo se puede emitir un int a un float)Conversiones entre tipos de datos en C#

tipos de datos A y B son míos.

¿Es posible definir las reglas por las que se produce esta conversión?

Ejemplo

int a = 1; 
float b = (float)a; 
int c = (int)b; 

Respuesta

14

Sí, esto es posible usando C# operador sobrecarga. Hay dos versiones explicit y implicit.

Aquí es un ejemplo completo:

class Program 
{ 
    static void Main(string[] args) 
    { 
     A a1 = new A(1); 
     B b1 = a1; 

     B b2 = new B(1.1); 
     A a2 = (A)b2; 
    } 
} 

class A 
{ 
    public int Foo; 

    public A(int foo) 
    { 
     this.Foo = foo; 
    } 

    public static implicit operator B(A a) 
    { 
     return new B(a.Foo); 
    } 
} 

class B 
{ 
    public double Bar; 

    public B(double bar) 
    { 
     this.Bar = bar; 
    } 

    public static explicit operator A(B b) 
    { 
     return new A((int)b.Bar); 
    } 
} 

tipo A se puede convertir implícitamente al tipo B, pero de tipo B debe convertirse explícitamente al tipo A.

4

Suponiendo que desea que para ser una operación explcit tendrá que escribir un operador de conversión explícita de este modo:

public static explicit operator MyTypeOne(MyTypeTwo i) 
{ 
    // code to convert from MyTypeTwo to MyTypeOne 
} 

a continuación, puede usarlo de esta manera:

MyTypeOne a = new MyTypeOne(); 
MyTypeTwo b = (MyTypeTwo)a; 

Me pregunto si realmente desea convertir un tipo a otro, o si realmente desea convertir en su lugar. Diría que debes evitar escribir conversiones a los operadores de elenco, si solo pretendes aprovechar una buena sintaxis :)

Además, en general, se recomienda no usar moldes implícitos, ya que permiten el tipo involuntario conversiones De MSDN documentation on implicit:

Sin embargo, debido a las conversiones implícitas pueden ocurrir sin que el programador de especificarlos, se debe tener cuidado para evitar sorpresas desagradables . En general, los operadores de conversión implícita nunca deben arrojar excepciones y nunca pierden información para que se puedan usar de forma segura sin el conocimiento del programador .

Cuestiones relacionadas