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



例如,我有一个随机数,但它可以有"特殊数字"值。类似的东西:

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;

如果没有,我有什么可能做到这一点?

如果值匹配,则可以将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
    }
}

最简单的方法可能是将intenum都放入struct中。您可以定义转换运算符和算术运算符,使处理您的类型更加容易。

例如

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,您仍然应该定义转换和运算符,以便所有内容都匹配。正如Wai Ha Lee所指出的,虽然你可以只使用enum,但我不建议使用它,因为你本质上有一个自己的类型,它有自己的语义(只是C#中的enum恰好在某种程度上支持这些语义)。

最新更新