Dans une switchinstruction de correspondance de modèle utilisant un casepour 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 nulln'a pas de type et ne satisfait donc à aucune des conditions ci-dessus. Le type statique de someStringn'entre en jeu dans aucun des deux exemples.
Le vartype bien que dans la correspondance de modèle agit comme un joker et correspondra à n'importe quelle valeur, y compris null.
Le defaultcas ici est un code mort. Le case var ocorrespondra à 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 defaultsera 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 defaultcas 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 defaultne sera jamais atteint (même pour ceux boolqui 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.
oeststring(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 xse comporte différemment quevar xmême quandxest tapé (par le compilateur) commestring