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

Compare Two Enum Values Cast to Object

提问人:Tommaso Belluzzo 提问时间:11/9/2016 更新时间:11/10/2016 访问量:141

问:

我创建了一个自定义.在它里面有一个,在初始化期间填充了一个枚举器的值:UserControlComboBox

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_LastCategorySelectedItemtrue

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

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

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

我仍然不确定这是否是正确的方法。

C# .NET 枚举强制 转换 相等

评论


答:

2赞 Asik 11/9/2016 #1

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

这样做。默认情况下,对象相等是引用相等,即这两个引用指向内存中的同一位置。两个装箱枚举是位于内存中两个不同位置的两个对象,这就是为什么无论它们包含什么值,它们总是不相等的原因。

此外,通常最好尽可能多地保留类型信息;这使编译器可以帮助您编写正确的程序。键入变量 as 与此原则背道而驰。m_LastCategoryObject