2009-03-01 12 views
16

Ho appena visto che stava usando in una delle recenti risposte:implicita operatore

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

Perché abbiamo bisogno di parola implicita qui, e cosa significa?

risposta

28

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

È ora possibile fare questo:

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

invece di dover fare questo:

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

Un esempio del perché questo è una distinzione utile è tipi numerici. C'è una conversione implicita da tipi "più piccoli" ai tipi di "più grande", ad esempio:

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

Ma la conversione di tipi più grandi per i tipi più piccoli può essere pericoloso, quindi c'è solo una conversione esplicita, costringendo l'utente a precisare che lui davvero intende eseguire l'operazione in questione:

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

Hai mescolato le parole nel casting dei numeri espliciti. "convertire tipi più piccoli in tipi più grandi" dovrebbe essere il contrario. – Samuel

+0

Grazie. Ho corretto il mio errore. – mquander

+0

float è più piccolo del doppio, non è vero? – configurator

2

Solo per aggiungere alla risposta di mquander.

Dalla specifiche C# 3.0 lingua:

Una dichiarazione operatore di conversione che include la parola implicit introduce una implicita conversione definita dall'utente. Le conversioni implicite possono verificarsi in una varietà di situazioni, incluse chiamate di membri di funzione, espressioni di trasmissione e assegnazioni.

(sezione 10.10.3)

0

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

Ciò significa che la conversione tra Booleano e Savepoint può essere eseguita implicitamente, ad es. = nascosto.

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

Conversione esplicita, ad es. evidente, può essere fatto in questo modo:

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

conversione implicita viene spesso utilizzato quando non v'è alcuna perdita di dati possibili, cioè Int16 (short) a Int32 (int). Ma se è possibile, è necessario "concordare" con essa utilizzando 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 vi consiglio di definire esplicitamente operatore!

7

Sembra un abuso di un operatore implicito. Non so cosa faccia la classe Savepoint, ma convertirlo in un booleano non sembra logico. L'operatore implicito consente di verificare se un riferimento punto di salvataggio è nullo o non semplicemente valutando il riferimento:

if (point) { 

anziché:

if (point != null) { 

Se è usato in questo modo, che si nasconde ciò che il codice sta facendo davvero, e questo va contro praticamente tutto ciò che riguarda C#.

+0

Questo è completamente corretto. – mquander

1

Gli operatori di conversione convertono da un tipo all'altro. Implicito significa che non è necessario digitare un cast esplicito nel codice affinché la conversione avvenga, esplicitamente richiede che il cast nel codice venga chiamato.

Si utilizza l'operatore di conversione implicita quando si è certi che la conversione non perda dati. Ad esempio, con l'ampliamento delle coercizioni (int -> long, float -> double). Gli operatori di conversione esplicita vengono utilizzati quando alcuni stati andranno persi o non si desidera che il compilatore sviti automaticamente il codice client inserendo le conversioni ovunque.

Una conversione come la tua sarebbe davvero devastante perché è sconsigliabile eseguire questa particolare conversione.