枚举值作为函数的结果

时间:2012-07-03 07:04:42

标签: c#

我有三个枚举:

enum ValueType : int
{
  FloatingPoint = 2,
  .../...
}
enum ConstraintType : int
{
  Range = 2,
  .../...
} 
enum Parameter : int 
{
  ExposureTime = F(ValueType.FloatingPoint, ConstraintType.Range, 23),
  .../...
}

问题在于F的签名,如果我使用:

private static int F(ValueType _V, ConstraintType _C, int _N) { ... }

我在Parameter的定义中为每个调用收到错误(无效参数),但如果我使用以下代码:

private static int F(int _V, int _C, int _N) { ... }

一切都很好。

这不是阻塞问题,但我想理解为什么会这样。

2 个答案:

答案 0 :(得分:9)

C#规范在第14.3节(“Enum成员”)中说明了

  

在枚举成员初始值设定项中,其他枚举成员的值为   总是被视为具有其基础类型的类型,以便   在提到其他枚举成员时,没有必要使用强制转换。

据我所知,这就是为什么参数看起来有int的类型。有趣的是,这不会导致无效的参数错误:

ExposureTime = F((ValueType)ValueType.FloatingPoint, 
                 (CostraintType)ConstraintType.Range,
                 23),

当然,它仍然会导致另一个错误,因为你不能像Marc所说的那样使用方法调用来初始化枚举成员。方法调用不是常量表达式,而

  

枚举成员的关联值是隐式分配的   或明确地。如果枚举成员的声明有   常量表达式初始化程序,常量的值   表达式,隐式转换为枚举的基础类型,   是枚举成员的关联值。如果枚举成员的声明没有初始值设定项,则隐式设置其关联值[...]

答案 1 :(得分:7)

对于具有显式值的枚举,该值必须是常量表达式。 F(...) 是常量表达式。无论参数是int还是枚举,您都无法从函数调用中分配枚举值。

你的“一切都很好”实际上意味着:

  

分配给'blah.Parameter.ExposureTime'的表达式必须是常量

这里唯一的“问题”是编译器没有给特定的非法场景提供非常优雅的错误消息。