Странное enum.TryParse поведение - PullRequest
0 голосов
/ 29 февраля 2012

У меня есть следующее определение свойства внутри производного класса окна WPF:

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;
  }
}

Функция всегда возвращает ноль. Итак, я думаю, я зайду в это и посмотрю, что происходит. Что ж, получается, что метод TryParse всегда возвращает false (т. Е. Вызывает выполнение тела второго оператора if и, таким образом, возвращает null). Я смотрю на значение строки, чтобы увидеть, действительно ли оно является допустимым значением для перечисления и достаточно ли оно верно. Почему синтаксический анализ всегда дает сбой, даже когда в TryParse отправляются действительные строки?

Вот определение enum:

  enum Side
  {
    Buy,
    Sell
  }

Обновление : ОК, ребята, определенный момент LOL здесь. Оказывается, что SelectedValue фактически возвращает само перечисление, а не строку, но когда я просматриваю его в отладчике, оно всегда неявно преобразует его в строку. Наконец, после прочтения ваших комментариев, я решил дважды щелкнуть значение в окне просмотра, чтобы, к своему ужасу, обнаружить, что это значение MyApp.Side.Sell - перечисление, а не строка. Итак, нарисуйте еще один, чтобы проверить, что результат as не равен нулю!

Ответы [ 3 ]

1 голос
/ 29 февраля 2012

У меня работает следующая программа LINQPad:

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

public enum Side{Buy, Sell}

Я предполагаю, что ваш SelectedValue ввод не на самом деле допустимое значение для перечисления, даже если вы думаете,это так.

0 голосов
/ 29 февраля 2012

Если вы дважды проверили, что значение в порядке, вы, вероятно, допустили ту же ошибку, которую я совершал много раз;Enum.TryParse может анализировать строки Buy и Sell, однако он не может анализировать строки Side.Buy и Side.Sell.

0 голосов
/ 29 февраля 2012

Из предоставленного кода мне не кажется, что у вас могут возникнуть проблемы с этим, если нет

  • , проверьте на самом деле значение SideComboBox.SelectedValue as string кода

  • использование Enum.TryParse с перегрузкой с параметром, указывающим игнорировать регистр, как это

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

Таким образом, если строка в combo имеет другой регистр, она, кстати, будет «перехвачена».

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...