Questa domanda è stata oggetto del mio blog il 30 maggio 2013 . Grazie per l'ottima domanda!
Stai fissando un vialetto vuoto.
Qualcuno ti chiede "il tuo vialetto può contenere una Honda Civic?"
Sì. Sì, può.
Qualcuno ti indica un secondo vialetto. È anche vuoto. Chiedono "Il contenuto attuale del mio vialetto può adattarsi al tuo vialetto?"
Sì, ovviamente. Entrambi i passi carrai sono vuoti! Quindi chiaramente il contenuto di uno può adattarsi all'altro, perché non ci sono contenuti di nessuno dei due in primo luogo.
Qualcuno ti chiede "Il tuo vialetto contiene una Honda Civic?"
No non lo fa.
Stai pensando che l' isoperatore risponda alla seconda domanda: dato questo valore, si adatta a una variabile di quel tipo? Un riferimento null rientra in una variabile di questo tipo? Sì lo fa.
Non è questa la domanda a cui l' isoperatore risponde. La domanda a cui l' isoperatore risponde è la terza domanda. y is Xnon chiede " è yun valore legale di una variabile di tipo X? " Chiede " È yun riferimento valido a un oggetto di tipo X? " Poiché un riferimento null non è un riferimento valido a nessun oggetto di qualsiasi tipo, la risposta è "no ". Quel vialetto è vuoto; non contiene una Honda Civic.
Un altro modo di guardare è che y is Xrisponde alla domanda "se dicessi y as X, otterrei un risultato non nullo? Se y è nullo, chiaramente la risposta è no!
Per approfondire la tua domanda:
Ci si aspetta che il valore null appartenga a qualsiasi tipo di riferimento (o nullable)
Si suppone implicitamente che un tipo sia un insieme di valori e che la compatibilità di assegnazione di un valore y con una variabile di tipo X non sia altro né meno che verificare se y sia un membro dell'insieme x .
Anche se questo è un modo estremamente comune di guardare i tipi, non è l' unico modo di guardare i tipi, e non è il modo in cui C # guarda i tipi. I riferimenti null sono membri di nessun tipo in C #; la compatibilità delle assegnazioni non sta semplicemente verificando un set per vedere se contiene un valore. Solo perché un riferimento null è compatibile con l'assegnazione con con una variabile di tipo X di riferimento non significa che null sia un membro di tipo X. La relazione "è un'assegnazione compatibile con" e la relazione "è un membro di tipo" ovviamente ha un sacco di si sovrappongono, ma non sono identici nel CLR.
Se ti interessano le riflessioni sulla teoria dei tipi, dai un'occhiata ai miei recenti articoli sull'argomento:
Come si chiama questo "tipo"? Prima parte
Come si chiama questo "tipo"? Seconda parte