Dans une switch
instruction de correspondance de modèle utilisant un case
pour un type explicite, il est demandé si la valeur en question est de ce type spécifique ou d'un type dérivé. C'est l'équivalent exact deis
switch (someString) {
case string s:
}
if (someString is string)
La valeur null
n'a pas de type et ne satisfait donc à aucune des conditions ci-dessus. Le type statique de someString
n'entre en jeu dans aucun des deux exemples.
Le var
type bien que dans la correspondance de modèle agit comme un joker et correspondra à n'importe quelle valeur, y compris null
.
Le default
cas ici est un code mort. Le case var o
correspondra à n'importe quelle valeur, nulle ou non nulle. Un cas non par défaut l'emporte toujours sur un cas par défaut et ne default
sera donc jamais atteint. Si vous regardez l'IL, vous verrez qu'il n'est même pas émis.
En un coup d'œil, il peut sembler étrange que cela compile sans aucun avertissement (m'a définitivement jeté). Mais cela correspond au comportement C # qui remonte à 1.0. Le compilateur autorise les default
cas même lorsqu'il peut prouver de manière triviale qu'il ne sera jamais atteint. Considérez comme exemple ce qui suit:
bool b = ...;
switch (b) {
case true: ...
case false: ...
default: ...
}
Ici default
ne sera jamais atteint (même pour ceux bool
qui ont une valeur qui n'est pas 1 ou 0). Pourtant, C # a permis cela depuis 1.0 sans avertissement. La correspondance de modèle est juste en ligne avec ce comportement ici.
o
eststring
(confirmée avec les génériques - c'est-à-direFoo(o)
oùFoo<T>(T template) => typeof(T).Name
) - c'est un cas très intéressant oùstring x
se comporte différemment quevar x
même quandx
est tapé (par le compilateur) commestring