【问题标题】:Compare Two Enum Values Cast to Object比较两个枚举值转换为对象
【发布时间】:2017-03-22 19:08:56
【问题描述】:

我创建了一个自定义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())

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

【问题讨论】:

    标签: c# .net enums casting equality


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-09
      • 1970-01-01
      • 1970-01-01
      • 2012-08-12
      • 1970-01-01
      相关资源
      最近更新 更多