À l'intérieur d'un modèle de correspondance switch
en utilisant un case
pour un type explicite, c'est demander si la valeur en question est de ce type spécifique, ou d'un type dérivé. C'est l'équivalent exact de is
switch (someString) {
case string s:
}
if (someString is string)
La valeur null
n'a pas de type et ne satisfait donc pas à l'une des conditions ci-dessus. Le type statique de someString
n'entre pas en jeu dans les deux exemples.
Le site var
dans le filtrage de motifs, agit comme un caractère de remplacement et correspondra à n'importe quelle valeur, notamment null
.
Le site default
Ce cas est un code mort. Le site 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, donc default
ne sera jamais touché. Si vous regardez l'IL, vous verrez qu'il n'est même pas émis.
Au premier coup d'œil, il peut sembler étrange que cela compile sans aucun avertissement (cela m'a certainement déconcerté). Mais cela correspond au comportement du C# qui remonte à la version 1.0. Le compilateur permet default
même lorsqu'il peut trivialement prouver qu'il ne sera jamais touché. Considérons par exemple ce qui suit :
bool b = ...;
switch (b) {
case true: ...
case false: ...
default: ...
}
Ici default
ne sera jamais atteint (même pour bool
qui ont une valeur qui n'est pas 1 ou 0). Pourtant, C# a permis cela depuis la version 1.0 sans avertissement. La correspondance de motifs s'aligne simplement sur ce comportement ici.