8

我有三个枚举:

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) { ... }

一切安好。

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

4

2 回答 2

9

C# 规范在第 14.3 节(“枚举成员”)中指出

在枚举成员初始化程序中,其他枚举成员的值始终被视为具有其基础类型的类型,因此在引用其他枚举成员时不需要强制转换。

据我所知,这就是为什么论点似乎具有int. 有趣的是,这不会导致无效参数错误:

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

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

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

于 2012-07-03T07:12:07.160 回答
7

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

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

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

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

于 2012-07-03T07:10:22.973 回答