Pregunta

Acabo de ver que se estaba usando en una de las respuestas recientes:

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

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

¿Fue útil?

Solución

implícito significa que la conversión no requiere un yeso 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 "pequeños" a los tipos de "grandes", por ejemplo:

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

Sin embargo, la conversión de los 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

Otros consejos

Eso parece mal uso de un operador implícito. No sé lo que hace la clase Savepoint, pero la conversión a un valor lógico no parece lógico. El operador implícito que 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 está haciendo realidad, y que va en contra de casi todo lo que está a punto de C #.

Sólo para añadir 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 implicit   introduce una definida por el usuario implícita   conversión. Las conversiones implícitas puede   ocurrir en una variedad de situaciones,   incluyendo invocaciones miembro función,   emitir expresiones y asignaciones.

(sección 10.10.3)

Los operadores de conversión convertir de un tipo a otro. Implícita significa que usted no tiene que escribir una conversión explícita en el código para la conversión a suceder, explícita requiere que fundido en código que se llama.

Se utiliza operador de conversión implícita cuando esté seguro de que la conversión no pierde ningún dato. Por ejemplo, la ampliación de coacciones (int -> long, float -> doble). operadores de conversión explícita se utilizan cuando se pierde algún estado o que no quieren compilador para atornillar automáticamente código de cliente mediante la inserción de las conversiones por todo el lugar.

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

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

Esto significa que la conversión entre Boolean y Savepoint puede realizarse implícitamente, por ejemplo = Oculta.

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

La conversión explícita, por ejemplo, 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) a Int32 (int). Pero si es posible, es necesario que 'de acuerdo' con él utilizando la conversión explícita.

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

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 te recomiendo que define el operador explícita!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top