2011-01-02 22 views
9

dado un poco de código como este:¿Cómo se permite la conversión implícita?

class Json 
{ 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
    } 

    Json MyAction() 
    { 
     return "{\"json\": 1}"; 
    } 
} 

¿Hay algo que pueda añadir a la clase Json para hacer esta compilación? ¿Algo que le permita al compilador saber que puede lanzar implícitamente una cadena a un Json?

+1

me gustaría añadir un .ToJson() '' método de extensión en lugar de sobrecargar el operador 'implicit' ya que este tipo de conversión implícita viola algunas pautas importantes (véase la respuesta de Saeed). En particular, puede arrojar, no es sin pérdida y tiene una semántica extraña en las comparaciones. – CodesInChaos

+0

@CodeInChaos: puedo hacerlo no tirar :) Mi mayor preocupación aquí es que la acción simplemente devuelve un tipo diferente para diferenciarlo de una cadena, aunque de lo contrario puede actuar perfectamente como una cadena. De esta forma sé qué ContentType configurar sin que el usuario tenga que realizar ningún trabajo adicional (simplemente configure el tipo de devolución de la función de forma apropiada). – mpen

Respuesta

27

La declaración implicit operador en C# le permite especificar:

{type to convert to} ({type to convert from} variablename) 

Aquí está un ejemplo sencillo:

class Json 
{ 
    private Json(string json) 
    { 
     //logic to parse string into object 
    } 

    public static implicit operator Json(string input) 
    { 
     return new Json(input); 
    } 
} 

Algunas notas:

  • En primer lugar, I wouldn' necesariamente va esta ruta, ya que la mayoría de str ings en su aplicación no son semánticamente equivalentes a una cadena JSON. El propósito de un operador de conversión es decir que dos tipos siempre representan información semánticamente equivalente (o lo suficientemente cerca como semánticamente equivalente para ser útilmente tratados como tales). Recomiendo implementar un método static Json Parse(string input) o tal vez incluso uno static bool TryParse(string input, out Json json) en su clase Json. El callsite, en general, debería saber si espera que su propia cadena contenga Json.

  • Normalmente, si mi clase ofrece una conversión de tipo implícita de un tipo, me parece que es mejor realizar cualquier lógica de análisis o ctor para ese mismo tipo private. Esto garantiza que solo hay una forma de que los consumidores puedan hacer algo en particular, no de dos maneras (ctor y conversión), de ahí el código privado en el ejemplo anterior. Puede haber excepciones a esto, pero ha sido una buena regla general para mí.

  • La conversión implícita también permite algunas cosas interesantes con los operadores de comparación. Por ejemplo, ahora que puede convertir implícitamente de cadena a json, también puede hacer: if(myJson == "blah") y hará la conversión y luego llamará al operador == en su objeto Json, que de forma predeterminada hará una comparación de igualdad de referencia.

+0

Se aceptará en ~ 12 minutos. No sabía que había una palabra clave 'implícita' para este tipo de cosas ... genial :) – mpen

4

Añadir un operador implicit:

public static implicit operator Json(string s) 
{ 
    return new Json(s); 
} 

La palabra clave implícita se utiliza para declarar un operador de conversión de tipo definido por el usuario implícita. Úselo para habilitar conversiones implícitas entre un tipo definido por el usuario y otro tipo, si se garantiza que la conversión no causará una pérdida de datos.

3

Usted puede tener un convertidor implícita pero tenga cuidado de no perder los datos:

Mediante la eliminación de moldes innecesarios, conversiones implícitas pueden mejorar la legibilidad de código fuente . Sin embargo, porque las conversiones implícitas pueden ocurrir sin que el programador las especifique , se debe tener cuidado para evitar sorpresas desagradables .En general, los operadores de conversión implícita deben nunca arrojar excepciones y nunca perder información para que puedan ser utilizados de manera segura sin el conocimiento del programador . Si un operador de conversión no puede cumplir esos criterios, debe marcarse explícitamente .

ver MSDN

Cuestiones relacionadas