2017-09-16 9 views
2

actuellement dans C# 7 (version 15.3.4) code suivant est valide pour la compilation, mais les deux variables sont légitimement inutilisables.Correction de correspondance dans le modèle

switch(fruit) 
{ 
    case Apple apple: 
    case Orange orange: 
    // impossible to use apple or orange 
    break; 
    case Banana banana: 
    break; 
} 

Si vous essayez de les utiliser, vous obtenez une erreur familière, la variable peut ne pas être initialisée avant d'y accéder.

Parfois, dans la correspondance de modèle, vous ne vous souciez pas du type exact, à condition que ce type soit dans la catégorie souhaitée. ici seulement des pommes et des oranges à titre d'exemple.

List<Fruit> applesAndOranges = new List<Fruit>(); 
switch(fruit) 
{ 
    case Fruit X when X is Apple || X is Orange: 
    applesAndOranges.Add(X); 
    break; 
    case Banana banana: 
    break; 
} 

Y a-t-il de meilleures approches?

Répondre

4

Vous pouvez utiliser des rejets si vous n'aimez pas créer des variables locales de type garbage dans la région actuelle. alors vous pouvez utiliser la variable commuté directement. vous pouvez avoir besoin de cast supplémentaire si la variable commuté est de super classe comme objet ou autre chose.

List<Fruit> applesAndOranges = new List<Fruit>(); 
switch(fruit) 
{ 
    case Apple _: 
    case Orange _: 
    applesAndOranges.Add(fruit); 
    break; 
    case Banana banana: 
    break; 
} 

Je ne sais pas comment la correspondance de modèles est compilée. s'il utilise des tables de saut, cette approche pourrait être aussi un peu plus rapide. la performance n'est pas mon problème cependant. c'est plus lisible.

Je suis déjà satisfait par les deux solutions, donc c'est Q & Un post que j'ai aimé partager.