我需要在其常量中存储枚举条目的一些属性。例如,指示颜色是冷还是暖。
enum Colors
{
Yellow, // warm
Blue, // cold
Gray, // cold
Red, // warm
// etc.
}
在C ++中,我将定义一个宏来为常量生成位掩码。 类似的东西:
#define WARM 1
#define COLD 0
#define MAKECOLOR(index, type) ((index << 8) | type)
enum Colors
{
Yellow = MAKECOLOR(0, WARM),
Blue = MAKECOLOR(1, COLD),
Gray = MAKECOLOR(2, COLD),
Red = MAKECOLOR(3, WARM),
// etc.
}
在C#中,这是不可能的,因为没有宏。我想避免直接在枚举中写入位掩码表达式。像这样:
...
Gray = ((2 << 8) | 0),
...
有什么想法吗?
P.S。
是的,我是一个语法糖怪。 :d
答案 0 :(得分:3)
答案 1 :(得分:2)
我做倾向于直接在枚举中写入位表达式:
enum Colors
{
Yellow = (0 << 8) | ColorTemp.Warm,
Blue = (1 << 8) | ColorTemp.Cold,
Gray = (2 << 8) | ColorTemp.Cold,
Red = (3 << 8) | ColorTemp.Warm,
}
enum ColorTemp
{
Cold = 0,
Warm = 1,
}
然后在文件底部写一个简单的扩展类,如下所示:
public static class ColorsExtensions
{
public ColorTemp GetTemperature(this Colors color)
{
return (ColorTemp)(color & 0x01);
}
}
答案 2 :(得分:0)
在C#中,enum
需要在编译时定义const
个值。总之,C#比C ++更const
。
在C#中,const用于表示编译时常量表达式。它类似于这个C ++代码:
enum {
count = buffer.Length;
}
因为buffer.Length
是在运行时计算的,所以它不是常量表达式,因此会产生编译错误。
C#有readonly
个关键字,与C ++的const
更相似。 (虽然它仍然有限,但在C#中没有const-correctness这样的东西。)
const
用于表示编译时常量...而不仅仅是一个只读值。
我不敢在C#中指定只读但非编译时常量的局部变量。一些局部变量本质上是只读的 - 例如foreach
循环中的迭代变量以及using
语句的第一部分中声明的任何变量。但是,您无法创建自己的只读变量。
如果在方法中使用const
,则有效地将该标识符的任何用法替换为编译时常量值。
因此,您必须在enum
的编译时定义您的值。它们无法在运行时进行评估。这些是规则。