11

C#属性でconst Int32を使用できない理由を誰か説明できますか?

例:

private const Int32 testValue = 123;  
[Description("Test: " + testValue)]  
public string Test { get; set; }

コンパイラに次のように言わせます。

「属性引数は定数式でなければなりません...」

なんで?

4

3 に答える 3

23

エラーが示すように、属性引数は定数式でなければなりません。

文字列と整数の連結は、定数式ではありません。

したがって、"Test: " + 123直接渡すと、同じエラーが発生します。一方、testValue文字列に変更すると、コンパイルされます。


説明

定数式の規則では、両方のオペランド自体が定数式である場合、定数式に算術演算子を含めることができると規定されています。

したがって、"A" + "B"は依然として一定です。

ただし、整数オペランドがオブジェクトにボックス化されている を"A" + 1使用します。 定数式の規則は、次のことを明示的に述べています。string operator +(string x, object y);

ボックス化、ボックス化解除、null 以外の値の暗黙的な参照変換を含むその他の変換は、定数式では許可されていません。

于 2013-01-09T19:24:05.470 に答える
3

int と string の間の '+' 演算子は、「コンパイル時定数」ではない int の ToString メソッドの呼び出しを引き起こします。こんな感じです

private const int x = 3;
private const string s = x.ToString(); // cannot be done
于 2013-01-09T19:26:10.670 に答える
0

演算子の結果を含むコンパイル時に評価された定数のみを渡すことができ、stypeof()を除外してs コンストラクターに渡すことができますdecimalAttribute

于 2013-01-09T19:24:37.273 に答える