Dentro de una switch
declaración de coincidencia de patrones que usa case
para 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 null
no tiene un tipo y, por lo tanto, no cumple ninguna de las condiciones anteriores. El tipo estático de someString
no entra en juego en ningún ejemplo.
El var
tipo aunque en la coincidencia de patrones actúa como un comodín y coincidirá con cualquier valor incluyendo null
.
El default
caso aquí es un código muerto. El case var o
coincidirá con cualquier valor, nulo o no nulo. Un caso no predeterminado siempre gana sobre uno predeterminado, por default
lo 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 default
casos incluso cuando puede demostrar trivialmente que nunca se alcanzará. Considere como ejemplo lo siguiente:
bool b = ...;
switch (b) {
case true: ...
case false: ...
default: ...
}
Aquí default
nunca se activará (incluso si bool
tiene 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í.
o
sestring
(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 x
se comporta de manera diferente quevar x
incluso cuandox
se escribe (por el compilador) comostring