2011-08-04 20 views
7

Tengo una clase de genéricos que utilicé para escribir datos en IsolatedStorage.C# creando una conversión implícita para la clase genérica?

puedo utilizar un static implicit operator T() convertir de mi clase genérica al parámetro genérico T

por ejemplo,

MyClass<double> foo = new MyClass(187.0); 

double t = foo; 

Mi pregunta es, ¿cómo puedo hacer a la inversa?

MyClass<double> foo = new MyClass(187.0); 
double t = 0.2d; 
foo = t; 

El operador implícita ha de ser estática, así que no estoy seguro de cómo me puede pasar en el caso de mi clase?

+1

¿Cómo se define el segundo operador implícito? Debería verse como una imagen reflejada del primero (con los tipos invertidos). ¿Eso no funciona? –

+0

Eso funciona, pero esperaba usar un método de clase, en lugar de construir un objeto nuevo. – Alan

+1

bien, pero sí, no funciona de esa manera. La conversión de tipo siempre debe producir una nueva instancia de un tipo. (y realmente, esos tipos deben ser inmutables) –

Respuesta

7

EDIT:

Si usted quiere ser capaz de cambiar el valor de T en su clase, recomendaría exponerlo como una propiedad como:

T Value { get; set; } 

que le permitirá cambiar el valor, en lugar del comportamiento del operador implícito que devuelve una instancia completamente nueva de la clase.


Puede y no puede utilizar operadores implícitos. Hacer algo como

public static implicit operator int(MyType m) 
public static implicit operator MyType(int m) 

implícitamente convertir de MyType a int y desde int a MyType respectivamente. Sin embargo, tiene razón, ya que son estáticos, el int a MyType específicamente tendrá que crear una nueva instancia de MyType y devolver eso.

lo que este código:

MyClass<double> foo = new MyClass(187.0); 
double t = 0.2d; 
foo = t; 

no reemplazaría el valor de foo con t, el operador implícito podría devolver un totalmente nuevoMyClass de t y asignar a que Foo.

+0

Para su edición, así es como lo estoy haciendo hoy. Solo pensé que sería mejor no usar '.Value' en todas partes. – Alan

+2

Yo usaría '.Value' en todas partes. Mantiene su código más limpio y más legible. Los operadores implícitos son útiles, pero el uso excesivo puede hacer que su código sea difícil de leer. Lo estás haciendo de la manera correcta. –

1

Usted debe ser capaz de convertir a la inversa, simplemente especificando otro operador implícito:

public static implicit operator MyClass<T>(T input) 
{ 
    return new MyClass<T>(input); 
} 
10

Esta clase muestra la conversión entre T y MiClase, en ambos sentidos.

class MyClass<T> 
{ 
    public MyClass(T val) 
    { 
    Value = val; 
    } 

    public T Value { get; set; } 

    public static implicit operator MyClass<T>(T someValue) 
    { 
    return new MyClass<T>(someValue); 
    } 

    public static implicit operator T(MyClass<T> myClassInstance) 
    { 
    return myClassInstance.Value; 
    } 
} 
+0

Vea la pregunta adicional en http://stackoverflow.com/questions/39618845/implicit-operator-with-generic-not-working-for-interface –

Cuestiones relacionadas