我可以将int和enum存储在一起吗?

时间:2015-02-24 05:48:26

标签: c#

例如,我有一个随机数,但它可以有#34;特殊数字"值。这样的事情:

enum XNumber { INFINITY, NEGATIVE, int }

所以我可以存储:

var i = XNumber.INFINITY;
var i = XNumber.NEGATIVE;
var i = (XNumber) 1;
var i = (XNumber) 500;
var i = (XNumber) -1000;

如果没有,我有什么可能做到的?

2 个答案:

答案 0 :(得分:2)

如果值匹配,则enum可以转换为int 。请注意,您可以为枚举值分配数值。例如,

namespace Test
{
    enum SpecialValue
    {
        Zero = 0,
        Five = 5,
        Seventy = 70
    }

    private void method()
    {
        var five = (SpecialValue)5; // == SpecialValue.Five
        int seventy = (int)SpecialValue.Seventy; // == 70
    }
}

答案 1 :(得分:0)

最简单的方法可能是将intenum放入struct。您可以定义转换运算符和算术运算符,以便更轻松地使用您的类型。

e.g。

struct XNumber {
  private enum SpecialValue { Normal, Negative, Infinity}
  private int value;
  private SpecialValue kind;

  public XNumber Infinity = new XNumber { kind = SpecialValue.Infinity };
  public XNumber Negative = new XNumber { kind = SpecialValue.Negative };

  public static implicit operator XNumber(int value) {
    if (value < 0)
      return new XNumber { kind = SpecialValue.Negative };
    return new XNumber { value = value };
  }

  // ...
}

类似的东西,取决于您的确切需求。

另一种方法是,如果您不需要int的全部范围,则使用无穷大和负值的特殊值,您只需要存储int。仍然是struct,你仍然应该定义转换和运算符,以便一切都匹配。虽然你可以只用enum来逃避,正如Wai Ha Lee指出的那样,我不推荐它,因为你本质上有一个自己的类型,它有自己的语义(只是那些碰巧有点支持{ {1}}在C#中。