奇怪的enum.TryParse行为

时间:2012-02-28 22:13:10

标签: c# wpf c#-4.0

我在WPF Window派生类中有以下属性定义:

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

该函数始终返回null。所以我想,我会介入它,看看发生了什么。好吧,事实证明,TryParse方法总是返回false(即,导致第二个if语句的主体执行,从而返回null)。我查看字符串的值,看看它实际上是否是枚举的有效值,并且确定它是。为什么即使将有效字符串发送到TryParse中,解析总是会失败?

以下是枚举定义:

  enum Side
  {
    Buy,
    Sell
  }

更新:好的家伙,这里有一个明确的LOL时刻。事实证明,SelectedValue实际上是返回枚举本身而不是字符串,但是当我在调试器中查看它时,它总是隐式地将它转换为字符串。最后,在阅读完你的评论之后,我决定实际上双击观察窗口中的值,只是发现我的恐怖价值是MyApp.Side.Sell - 枚举而不是字符串。所以,用另一个来检查as的结果是非空的!

3 个答案:

答案 0 :(得分:1)

以下LINQPad程序适用于我:

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

public enum Side{Buy, Sell}

我猜你的SelectedValue输入实际上 枚举的有效值,即使你认为它是。

答案 1 :(得分:0)

从提供的代码看来,我不应该有这个问题,如果不是

  • 实际检查SideComboBox.SelectedValue as string代码

  • 的值
  • 使用Enum.TryParse重载参数指定忽略大小写,如此

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

通过这种方式,如果combo中的字符串具有不同的大小写,那么它将被“捕获”。

希望这会有所帮助。

答案 2 :(得分:0)

如果你仔细检查过这个值是否合适,你可能犯了很多次我犯过的错误; Enum.TryParse可以解析字符串BuySell,但 不能 解析字符串Side.Buy和{{1} }。