【问题标题】:arithmetic operations on enum values枚举值的算术运算
【发布时间】:2012-03-20 09:16:13
【问题描述】:

c# 枚举支持哪些算术运算?令人惊讶的是,我无法通过谷歌、维基百科和 stackoverflow 找到它。

我可以添加两个枚举值没有任何强制转换吗?将任意常数添加到一个值或减去它? 或者枚举是否保证该类型的值始终是定义的枚举值或其位掩码之一?

class ... {...
enum WeekDays : byte { Sun = 1, Mon = 2, Tue = 3, /* and so on*/ Sat = 7 };
public static bool IsWeekend (WeekDays _d) {
/// Can I be sure here that _d has value from 1..7? May it be any of 0..255?
}

我知道按位运算,支持它们表示标志似乎是合理的。

Wikipedia 告诉我们,我的示例还允许 _d - 1WeekDays.Tue - WeekDays.Mon,这对于严格排序的顺序枚举很有用,但我找不到任何标准参考,请您指点我吗?

【问题讨论】:

  • 你能不能只是测试一下看看会发生什么?
  • 我的意思是了解标准,而不是特定的编译器行为。首先,我想确定,我的代码对于任何支持标准 c#(MS、Mono、)的编译器都是正确的。其次,我想从相应的标准文章中阅读一些有用的东西,以便更好地为我的 c# 测试做好准备。

标签: c# .net enums


【解决方案1】:

以下运算符可用于枚举类型的值:==!=<><=>=+-^&|~++--sizeof

【讨论】:

  • 谢谢。你是怎么找到的?任何参考,手册页? + 这里是指<enum value>+<enum value>吗?
  • - 是否代表二进制减号?同样,<enum val>+<enum val> 是否允许?
  • @gluk47,枚举中每个元素的底层类型都是整数类型,char 除外。因此枚举具有与 int 数据类型等相同的操作。
  • char 不能是基础类型。 允许的枚举类型为 byte、sbyte、short、ushort、int、uint、long 或 ulong。 MSDN。维基百科说枚举值也不能相乘。在我的帖子的其他原因中,我有一个测试问题«可以将二元运算符%应用于枚举值»。我的答案需要一些参考)
  • C# 语言规范标识了操作部分下的枚举操作。例如,关系运算在msdn.microsoft.com/en-us/library/aa664726(v=vs.71).aspx 页面上有一段关于有效运算符的段落;即,枚举值在应用运算符之前被强制转换为它们的基础类型。加法和减法也是如此。
【解决方案2】:

如果你想使用算术运算,不要使用enums,使用numbersEnums 是数值的命名约定,使它们更具人类可读性并允许它们的组合。这实际上是您在互联网上没有找到任何相关信息的原因,因为 enums 不应该这样做。

【讨论】:

  • 我想找到明确允许或禁止算术运算的标准章节,以确保并为我的学院老师提供参考。我还发现<enum value>+<const><enum value>-<enum value> 都是允许的,所以我很感兴趣从 C# 开发人员的角度来看还有什么意义,在我的代码中使用枚举值时我应该做出哪些假设。我个人禁止对枚举值进行任何操作,有可能明确允许按位数学,我同意你的观点)
  • @gluk47:请记住,枚举只是整数,因此它们支持所有可能的算术运算集。问题是,就像我说的,这不是在枚举类型上使用它们的情况,也就是说。但它们被禁止。
  • 其实它们是被禁止的。如果我尝试将两个枚举值相加或相乘,至少 VS2008 会引发错误。该操作可以通过将两个操作数转换为基础类型来进行,但我的问题是关于直接适用于枚举值的运算符。
  • @gluk47 - 你到底遇到了什么错误。我看不出您不能添加到枚举值的任何原因,它们只是整数值,可能需要强制转换。
  • 但我的问题是关于直接适用于枚举值的运算符。我可以投,是的,然后一切都会好起来的。这个问题与语法有关,没有演员表我能做什么。
猜你喜欢
  • 1970-01-01
  • 2011-01-28
  • 2016-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-30
相关资源
最近更新 更多