8

私は3つの列挙型を持っています:

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 が言うように、メソッド呼び出しを使用して enum メンバーを初期化することはできないため、別のエラーが発生します。メソッド呼び出しは定数式ではありませんが、

列挙メンバーの関連付けられた値は、暗黙的または明示的に割り当てられます。列挙型メンバーの宣言に定数式初期化子がある場合、列挙型の基になる型に暗黙的に変換されたその定数式の値は、列挙型メンバーの関連付けられた値です。列挙メンバーの宣言に初期化子がない場合、関連する値は暗黙的に設定されます [...]

于 2012-07-03T07:12:07.160 に答える
7

明示的な値を持つ列挙型の場合、値は定数式でなければなりません。定数式F(...)ではありません。パラメーターが列挙型であるintか列挙型であるかに関係なく、関数呼び出しから列挙値を割り当てることはできません。

あなたの「大丈夫」とは、実際には次のことを意味します。

「blah.Parameter.ExposureTime」に割り当てられる式は定数でなければなりません

ここでの唯一の「問題」は、コンパイラが特定の不正なシナリオに対して非常に洗練されたエラー メッセージを表示しないことです。

于 2012-07-03T07:10:22.973 に答える