2012-02-28 6 views
0

J'ai la définition de la propriété suivante à l'intérieur d'une classe dérivée fenêtre WPF:comportement Bizarre enum.TryParse

internal Side? Side 
{ 
    get 
    { 
    if (SideComboBox.SelectedIndex==-1) 
     return null; 

    Side side; 

    if (!Enum.TryParse(SideComboBox.SelectedValue as string, out side)) 
     return null; 

    return side; 
    } 
} 

La fonction retourne toujours nulle. Alors je me dis, je vais y aller et voir ce qui se passe. Eh bien, il s'avère que la méthode TryParse renvoie toujours la valeur false (c'est-à-dire que le corps de la seconde instruction if est exécuté et retourne donc null). Je regarde la valeur de la chaîne pour voir si elle est en fait une valeur valide pour l'énumération et bien sûr qu'elle l'est. Pourquoi l'analyse échoue-t-elle toujours même lorsque des chaînes valides sont envoyées dans TryParse?

Voici la définition enum:

enum Side 
    { 
    Buy, 
    Sell 
    } 

Mise à jour: OK les gars, un moment LOL défini ici. Il s'avère que SelectedValue retourne effectivement l'enum elle-même et non une chaîne, mais quand je l'affiche dans le débogueur, il la convertit toujours implicitement en une chaîne. Enfin, après avoir lu vos commentaires, j'ai décidé de double-cliquer sur la valeur dans la fenêtre de surveillance, seulement pour découvrir à mon horreur que la valeur est MyApp.Side.Sell - une énumération et non une chaîne. Alors, craie un autre pour vérifier le résultat de as pour être non nul!

+4

Vérifiez soigneusement la valeur de retour de 'SideComboBox.SelectedValue sous forme de chaîne' ... –

+0

Avez-vous vérifié la valeur de' SideComboBox.SelectedValue sous forme de chaîne'? – remio

+0

Voir Mise à jour et merci les gars! –

Répondre

1

Le programme LINQPad suivant fonctionne pour moi:

void Main() 
{ 
    Side side; 
    Enum.TryParse("Buy", out side).Dump(); 
    side.Dump(); 
} 

public enum Side{Buy, Sell} 

Je suppose que votre entrée SelectedValue n'est pas réellement une valeur valide pour l'ENUM, même si vous pensez qu'il est.

0

À partir du code fourni ne semble pas pour moi, vous devriez avoir un problème avec cela, sinon

  • vérifier réellement la valeur du code SideComboBox.SelectedValue as string

  • utilisation de Enum.TryParse surcharge avec le paramètre spécifiant ignorer le cas, comme celui-ci

    Enum.TryParse(SideComboBox.SelectedValue as string, true, out side)

De cette façon, si la chaîne dans le combo a un cas différent, il sera "attrapé" en passant.

Espérons que cela aide.

0

Si vous avez vérifié que la valeur est correcte, vous avez probablement fait la même erreur que j'ai faite plusieurs fois; Enum.TryParse peut analyser les chaînes Buy et Sell, mais il ne peut pas analyser les chaînes Side.Buy et Side.Sell.