type operator convert conversion cast another c# implicit-conversion implicit-cast

c# - operator - operador implícito



operator keyword c# (5)

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

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

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


Debe especificar ''implícito'' porque también hay operadores explícitos.

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

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;

La conversión implícita se usa a menudo cuando no hay una posible pérdida de datos, es decir, Int16 (short) a Int32 (int) . Pero si es posible, debe "estar de acuerdo" con él mediante una conversión explícita.

En su caso, por ejemplo, si Savepoint es solo un

struct Savepoint { public bool data; }

Puede utilizar la conversión implícita, porque no es posible la pérdida de datos:

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

De lo contrario te recomiendo definir operador explícito!


Eso parece mal uso de un operador implícito. No sé qué hace la clase Savepoint, pero convertirlo en un booleano no parece lógico. El operador implícito le permite verificar si una referencia de Savepoint es nula o no simplemente evaluando la referencia:

if (point) {

en lugar de:

if (point != null) {

Si se usa de esa manera, eso es esconder lo que realmente está haciendo el código, y va en contra de casi todo lo que C # trata.


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

Ahora puedes 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é esta distinción es útil son los tipos numéricos. Hay una conversión implícita de tipos "más pequeños" a tipos "más grandes", por ejemplo:

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

Pero convertir tipos más grandes en tipos más pequeños puede ser peligroso, por lo que solo hay una conversión explícita, lo que obliga al usuario a aclarar que 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


Los operadores de conversión convierten de un tipo a otro. Implícito significa que no tiene que escribir una conversión explícita en el código para que la conversión se realice, explícitamente requiere que se convierta esa conversión en el código.

Utiliza el operador de conversión implícito 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 utilizan cuando se pierde algún estado o no desea que el compilador arruine automáticamente el código del cliente insertando conversiones en todo el lugar.

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


Solo para agregar a la respuesta de mquander.

De la especificación de lenguaje C # 3.0:

Una declaración de 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 una variedad de situaciones, incluyendo invocaciones de miembros de funciones, expresiones de conversión y asignaciones.

(sección 10.10.3)