All'interno di switch
un'istruzione di corrispondenza del modello che utilizza a case
per un tipo esplicito si chiede se il valore in questione è di quel tipo specifico o di un tipo derivato. È l'esatto equivalente diis
switch (someString) {
case string s:
}
if (someString is string)
Il valore null
non ha un tipo e quindi non soddisfa nessuna delle condizioni precedenti. Il tipo statico di someString
non entra in gioco in nessuno dei due esempi.
Il var
tipo anche se nella corrispondenza del modello agisce come un carattere jolly e corrisponderà a qualsiasi valore incluso null
.
Il default
caso qui è codice morto. Il case var o
corrisponderà qualsiasi valore, null o non null. Un caso non predefinito vince sempre su uno predefinito, quindi default
non verrà mai colpito. Se guardi l'IL vedrai che non viene nemmeno emesso.
A prima vista può sembrare strano che questo si compili senza alcun preavviso (decisamente mi ha sbalordito). Ma questo corrisponde al comportamento di C # che risale a 1.0. Il compilatore consente default
casi anche quando può provare banalmente che non verrà mai colpito. Considera come esempio quanto segue:
bool b = ...;
switch (b) {
case true: ...
case false: ...
default: ...
}
Qui default
non verrà mai colpito (nemmeno perbool
se ha un valore diverso da 1 o 0). Tuttavia C # lo ha consentito dalla 1.0 senza preavviso. Il pattern matching è in linea con questo comportamento qui.
o
èstring
(confermata con i generici - cioèFoo(o)
doveFoo<T>(T template) => typeof(T).Name
) - è un caso molto interessante in cuistring x
si comporta in modo diversovar x
anche quandox
viene digitato (dal compilatore) comestring