Domanda

Ho appena visto che è stato utilizzato in una delle ultime risposte:

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

Perché abbiamo bisogno di una parola implicito qui, e che cosa significa?

È stato utile?

Soluzione

Implicito significa che la conversione non richiede un cast nel codice.

È possibile ora fare questo:

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

invece di dover procedere in questo modo:

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

Un esempio del perché questa è una distinzione utile è di tipi di dati numerici.C'è una conversione implicita da "piccoli" tipi "più grandi" tipi, e.g:

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

Ma la conversione più grandi tipi di piccoli tipi può essere pericoloso, quindi c'è solo una conversione esplicita, obbligando l'utente a chiarire che realmente si intende eseguire l'operazione in questione:

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

Altri suggerimenti

Che assomiglia a un uso improprio di un operatore implicito.Non so che cosa il punto di salvataggio classe, ma la conversione è un valore booleano non sembra logico.L'operatore implicito consente di verificare se un punto di salvataggio di riferimento è nullo o non è semplicemente la valutazione di riferimento:

if (point) {

invece di:

if (point != null) {

Se utilizzato in questo modo, a nascondere ciò che il codice è in realtà facendo, e che va contro praticamente tutto quello che C# è di circa.

Solo per aggiungere a mquander risposta.

Dal linguaggio C# 3.0 specifica:

Un operatore di conversione dichiarazione che include il implicit parola chiave introduce un utente definito dall'implicito di conversione.Le conversioni implicite può verificarsi in una varietà di situazioni, tra cui la funzione di membro invocazioni, cast espressioni e le assegnazioni.

(sezione 10.10.3)

Gli operatori di conversione la conversione da un tipo a un altro.Implicito significa che non è necessario digitare un cast esplicito nel codice per la conversione avvenga, esplicito richiede che il cast in codice per essere chiamato.

Si utilizza l'operatore di conversione implicito quando si è certi che la conversione non perdere tutti i dati.Per esempio, con ampliamento, di coercizioni (int -> long, float -> doppio).La conversione esplicita gli operatori vengono utilizzati quando qualche stato perso o non vuoi compilatore automaticamente la vite il codice del client inserendo le conversioni in tutto il luogo.

Una conversione come la tua sarebbe davvero causare il caos perché non è consigliabile eseguire questa conversione.

È necessario specificare 'implicito', perché c'è anche esplicito operatori.

Questo significa che la conversione tra Boolean e punto di salvataggio può essere fatto in modo implicito, ad es.= nascosto.

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

La conversione esplicita, ad esempioevidente, può essere fatto in questo modo:

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

La conversione implicita è spesso utilizzato quando non c'è la possibilità di perdita di dati, vale a dire Int16 (short) per Int32 (int).Ma se è possibile, è necessario "d'accordo" con la conversione esplicita.

Nel tuo caso, per esempio, se Savepoint è solo un

struct Savepoint
{
  public bool data;
}

è possibile utilizzare la conversione implicita, perché nessuna perdita di dati è possibile:

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

altrimenti mi consiglia di definire esplicitamente operatore!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top