2009-03-01 11 views
16

acabo de ver que estaba utilizando en una de las últimas respuestas:operador implícita

public static implicit operator bool(Savepoint sp) 
{ 
    return sp != null; 
} 

¿Por qué necesitamos la palabra implícita aquí, y qué significa?

Respuesta

28

Implícito significa que la conversión no requiere un molde en su código.

Ahora puede hacer esto:

Savepoint point = new Savepoint(); 
if(point) // becomes a bool using your operator 
{ 
} 

en lugar de tener que hacer esto:

Savepoint point = new Savepoint(); 
if((bool)point) // an "explicit" conversion 
{ 
} 

Un ejemplo de por qué esto es una distinción útil es tipos numéricos. Hay una conversión implícita de tipos "más pequeños" a los tipos "más grandes", por ejemplo:

float f = 6.5; 
double d = f; // implicit conversion 

Pero la conversión de tipos más grandes a tipos más pequeños puede ser peligroso, por lo que sólo hay una conversión explícita, obligando al usuario a aclarar que él realmente tiene la intención de realizar la operación en cuestión:

long l = 20; 
// short s = l; 
short s = (short)l; // explicit conversion 
+0

Tiene sus palabras mezcladas en el lanzamiento de números explícitos. "Convertir tipos más pequeños a tipos más grandes" debería ser al revés. – Samuel

+0

Gracias. Solucioné mi error – mquander

+0

flotador es más pequeño que el doble, ¿no? – configurator

2

Solo para agregar a la respuesta de mquander.

A partir de la especificación de C# 3.0 lengua:

Una declaración operador de conversión que incluye la palabra clave implicit introduce una conversión implícita definida por el usuario . Las conversiones implícitas pueden ocurrir en en una variedad de situaciones, incluyendo invocaciones de miembros de función, expresiones de conversión y asignaciones.

(sección 10.10.3)

0

Es necesario especificar 'implícita', porque también hay operadores explícitos.

Esto significa que la conversión entre Boolean y Savepoint se puede hacer implícitamente, p. Ej. = oculto

Savepoint s = new Savepoint(); 
bool b = s; 

Conversión explícita, p. Ej. evidente, se puede hacer de esta manera:

Savepoint s = new Savepoint(); 
bool b = (bool)s; 

conversión implícita se utiliza a menudo cuando no hay posible pérdida de datos, es decir Int16 (short)-Int32 (int). Pero si es posible, debe 'aceptar' usar conversión explícita.

En su caso, por ejemplo, si Savepoint es sólo un

struct Savepoint 
{ 
    public bool data; 
} 

puede utilizar la conversión implícita, ya que no hay pérdida de datos es posible:

Savepoint s = new Savepoint(); 
s.data = true; 
bool b = s; 

de lo contrario, recomiendan definir explícita ¡operador!

7

Parece un mal uso de un operador implícito. No sé lo que hace la clase Savepoint, pero convertirlo en booleano no parece lógico. El operador implícito le permite comprobar si una referencia Savepoint es nulo o no es simplemente la evaluación de la referencia:

if (point) { 

en lugar de:

if (point != null) { 

Si se utiliza de esa manera, que se esconde lo que el código de hecho, está yendo, y eso va en contra de casi todo lo que es C#.

+0

Esto es totalmente correcto. – mquander

1

Los operadores de conversión se convierten de un tipo a otro. Implícito significa que no tiene que escribir un lanzamiento explícito en el código para que la conversión suceda, explícitamente requiere que se invoque el lanzamiento en el código.

Utiliza el operador de conversión implícita cuando está seguro de que la conversión no pierde ningún dato. Por ejemplo, con coerciones de ampliación (int -> long, float -> double). Los operadores de conversión explícitos se usan cuando se pierde algún estado o no se quiere que el compilador automáticamente arruine el código del cliente insertando conversiones en cualquier lugar.

Una conversión como la suya realmente causaría estragos porque no es aconsejable realizar esta conversión en particular.

Cuestiones relacionadas