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

Compare Two Enum Values Cast to Object

我创建了一个自定义 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 不同(我肯定知道),它总是 returns true.

我知道,我可以简单地将两个变量都转换回枚举,然后比较它们以获得正确的结果。但是我使用 Object 是为了避免值的常量 boxing/unboxing 并使我的代码更加优雅。所以我想知道有没有什么办法可以解决这个问题。

到目前为止我发现的唯一可行的替代方法是这个:

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

而且我仍然不确定这是继续进行的正确方法。

I know, I could simply cast both variables back to enum and then compare them getting the right result.

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

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