4

次のテスト ケースで謎のコンパイル エラーが発生しました。

[TestCase(new byte[259], new byte[] { 0, 0, 0, 0, 255 })]
public void EncodeTest(byte[] source, byte[] expected) {
    ...
}

error CS0182: An attribute argument must be a constant expression,
typeof expression or array creation expression of an attribute parameter type

属性の最初の引数を次のように置き換えると:

[TestCase(new byte[259] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  
                          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                          0, 0, 0 },
              new byte[] { 0, 0, 0, 0, 255 })]
public void EncodeTest(byte[] source, byte[] expected) {
    ...
}

それはうまくコンパイルされます。なんで?

更新: 問題を明確にさせてください。次のようなコードを記述した場合:

int[] arr = new int[259];
Console.Write(arr[0]); // 0

コンパイラ (または CLR?) がすべての要素を既定値で暗黙的に初期化するため、コンパイル エラーは発生しません。

4

1 に答える 1

0

最初の構成では、単純に 259 バイトの配列を宣言しましたが、初期化されていません。確かに、CLR は組み込み値を自動的に初期化します (実際、これは配列であるため、組み込みでさえありません。オブジェクトです。byte[]キーワード (および演算子) は、コードの記述と読み取りを容易にするための単なる構文糖衣です。実際、あなたが書いたArray<System.Byte> someArray;、あなたsomeArrayがそれを初期化するまでnullになるでしょう、例えばsomeArray = new Array<System.Byte>(259);.

エラーが示すように、属性にはパラメーターとして定数 (または定数にすることができるもの) が必要です。

宣言された配列は、まさに宣言です。その中に何かありますか?あなたはそうは言っていませんが、コンパイラーは、ゼロで埋められた配列が必要であると想定できません。使用する値を明示的に指定する必要があります。属性はコンパイル時に評価され、使用したさまざまなコード構成にメタデータ (または提供する追加機能) を提供するコード構成を装飾/装飾します。

于 2013-07-08T13:10:12.683 に答える