比较两个枚举值转换为对象

时间:2016-11-09 01:30:28

标签: c# .net enums casting equality

我创建了一个自定义UserControl。在其中有一个ComboBox,它在初始化期间填充了枚举器的值:

m_ComboBox.Items.AddRange((Object[])Enum.GetValues(typeof(Categories)));

由于我想跟踪之前的ComboBox.SelectedItem,我创建了一个变量,用于存储其最后一个值:

private Object m_LastCategory;

private void ComboBoxSelectedIndexChanged(Object sender, EventArgs e)
{
    if (m_ComboBox.SelectedItem != m_LastCategory)
        DoSomething();

    m_LastCategory = m_ComboBox.SelectedItem;
}

if语句未按预期工作。实际上,即使m_LastCategory和当前SelectedItem不同(我肯定知道),它也会返回true

我知道,我可以简单地将两个变量都转换回枚举,然后比较它们得到正确的结果。但是我使用Object以避免值的持续装箱/取消装箱并使我的代码更加优雅。所以我想知道是否有办法解决这个问题。

到目前为止,我找到的唯一可行的替代方案就是这个:

if (m_ComboBox.SelectedItem.ToString() != m_LastCategory.ToString())

我仍然不确定这是否正确。

1 个答案:

答案 0 :(得分:2)

  

我知道,我可以简单地将两个变量都转换回enum然后   比较他们得到正确的结果。

那样做。 Object equality by default is reference equality,即那两个引用指向内存中的相同位置。两个盒装枚举是内存中两个不同位置的两个对象,这就是为什么它们总是不相等,无论它们包含什么值。

此外,保留尽可能多的类型信息通常是一个好主意;这让编译器可以帮助您编写正确的程序。将m_LastCategory变量键入为Object会违反此原则。