Qual è la differenza tra cast di tipo esplicito e implicito?

Qual è la differenza tra cast di tipo esplicito e implicito?

Questo è un po' complicato perché la sintassi "cast" in C# ha effettivamente un intervallo di diversi cose (cast, conversione primitiva, conversione su misura, ecc.)

In un cast implicito, c'è un'ovvia conversione di conservazione del riferimento tra i due:

List<int> l = new List<int>();
IList<int> il = l;

Il compilatore può dimostrare che questo è sicuro solo dall'analisi statica (List<int> è sempre un IList<int> )

Con un cast esplicito, o stai dicendo al compilatore che sai più di lui - "per favore, credimi, ma controlla comunque":

List<int> l = new List<int>();
IList<int> il = l;
List<int> l2 = (List<int>)il;

Anche se questo cast è possibile , il compilatore non accetterà che tutto IList<int> s sono in realtà List<int> - quindi dobbiamo dirgli di lasciar perdere.

In una conversione primitiva implicita (fornita dalle specifiche del linguaggio), si presume generalmente che esista una conversione sicura, non rischiosa e senza perdite (avvertenza:vedere il commento di Jon):

int i = 1;
float f = i;

Con una conversione primitiva esplicita, è probabile che la conversione potrebbe perdere dati o non è ovvio:

float f = 1;
int i = (int)f;

Con gli operatori su misura, tutte le scommesse sono annullate e dovresti guardare la documentazione. Potrebbe essere un cast di riferimento o potrebbe essere qualsiasi cosa . Potrebbe seguire regole simili alle conversioni primitive (esempio:decimal ), oppure potrebbe fare qualsiasi cosa in modo casuale:

XNamespace ns = "http://abc/def"; // implicit
XAttribute attrib = GetAttrib();
int i = (int)attrib; // explicit (extracts text from attrib value and
                     // parses to an int)

Entrambi eseguono codice personalizzato specifico del contesto.


Qual è la differenza tra il Presidente degli Stati Uniti e il Presidente del Canada?

Dal momento che non esiste un presidente del Canada, è difficile rispondere alla domanda. La cosa giusta da fare è respingere e chiedere chiarimenti sulla questione. Con "il presidente del Canada", l'interrogante intende la regina (capo di stato cerimoniale), il governatore generale (che può porre il veto sui progetti di legge) o il primo ministro (che agisce effettivamente come esecutivo), o qualcos'altro? Difficile dirlo senza chiarimenti.

E anche con un chiarimento, è una domanda vaga. Quali differenze vuoi sapere?

Dal momento che non esiste un "cast implicito" in C#, è difficile rispondere alla tua domanda. In C#, il cast è un operatore. Quindi lo respingerò.

Intendevi chiedere "qual è la differenza tra una conversione esplicita e una conversione implicita?" O volevi chiedere della semantica dell'operatore cast? O la differenza tra l'operatore cast e altri operatori di conversione del tipo? O situazioni in cui gli operatori di cast possono essere inseriti "implicitamente" nel codice dal compilatore? (Ad esempio, il ciclo foreach e l'operatore +=possono entrambi inserire implicitamente un cast invisibile.)

Puoi chiarire la domanda? Di quali due cose stai chiedendo un confronto e che tipo di differenze ti interessa?

Potresti prendere in considerazione la lettura del capitolo "Conversioni" della specifica C#. Le probabilità sono buone che qualsiasi domanda che hai sulle conversioni trovi risposta lì.


int i = 2;

float a = i;        // Implicit
float b = (float)i; // Explicit