例如,我有一个随机数,但它可以有"特殊数字"值。类似的东西:
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
}
}
最简单的方法可能是将int
和enum
都放入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
恰好在某种程度上支持这些语义)。