Dentro de una switchdeclaración de coincidencia de patrones que usa casepara un tipo explícito, se pregunta si el valor en cuestión es de ese tipo específico o de un tipo derivado. Es el equivalente exacto deis
switch (someString) {
case string s:
}
if (someString is string)
El valor nullno tiene un tipo y, por lo tanto, no cumple ninguna de las condiciones anteriores. El tipo estático de someStringno entra en juego en ningún ejemplo.
El vartipo aunque en la coincidencia de patrones actúa como un comodín y coincidirá con cualquier valor incluyendo null.
El defaultcaso aquí es un código muerto. El case var ocoincidirá con cualquier valor, nulo o no nulo. Un caso no predeterminado siempre gana sobre uno predeterminado, por defaultlo que nunca se alcanzará. Si miras el IL, verás que ni siquiera se emite.
De un vistazo, puede parecer extraño que esto se compile sin ninguna advertencia (definitivamente me desconcertó). Pero esto coincide con el comportamiento de C # que se remonta a 1.0. El compilador admite defaultcasos incluso cuando puede demostrar trivialmente que nunca se alcanzará. Considere como ejemplo lo siguiente:
bool b = ...;
switch (b) {
case true: ...
case false: ...
default: ...
}
Aquí defaultnunca se activará (incluso si booltiene un valor que no sea 1 o 0). Sin embargo, C # ha permitido esto desde la versión 1.0 sin previo aviso. La coincidencia de patrones simplemente se ajusta a este comportamiento aquí.
osestring(confirmado con los genéricos - es decirFoo(o), dondeFoo<T>(T template) => typeof(T).Name) - se trata de un caso muy interesante en el questring xse comporta de manera diferente quevar xincluso cuandoxse escribe (por el compilador) comostring