我有三个枚举:
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) { ... }
一切都很好。
这不是阻塞问题,但我想理解为什么会这样。
答案 0 :(得分:9)
C#规范在第14.3节(“Enum成员”)中说明了
在枚举成员初始值设定项中,其他枚举成员的值为 总是被视为具有其基础类型的类型,以便 在提到其他枚举成员时,没有必要使用强制转换。
据我所知,这就是为什么参数看起来有int
的类型。有趣的是,这不会导致无效的参数错误:
ExposureTime = F((ValueType)ValueType.FloatingPoint,
(CostraintType)ConstraintType.Range,
23),
当然,它仍然会导致另一个错误,因为你不能像Marc所说的那样使用方法调用来初始化枚举成员。方法调用不是常量表达式,而
枚举成员的关联值是隐式分配的 或明确地。如果枚举成员的声明有 常量表达式初始化程序,常量的值 表达式,隐式转换为枚举的基础类型, 是枚举成员的关联值。如果枚举成员的声明没有初始值设定项,则隐式设置其关联值[...]
答案 1 :(得分:7)
对于具有显式值的枚举,该值必须是常量表达式。 F(...)
不是常量表达式。无论参数是int
还是枚举,您都无法从函数调用中分配枚举值。
你的“一切都很好”实际上意味着:
分配给'blah.Parameter.ExposureTime'的表达式必须是常量
这里唯一的“问题”是编译器没有给特定的非法场景提供非常优雅的错误消息。