45

使用する定数がいくつかあり、それらをdoubleのconst配列に入れる予定でしたが、コンパイラーでは許可されません。

私はそれをこのように宣言しようとしました:

const double[] arr = {1, 2, 3, 4, 5, 6, 73, 8, 9 };

それから私はそれを静的な読み取り専用として宣言することに決めました:

static readonly double[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9};

しかし、問題は残っています。コンパイラがconst値の配列を宣言できないのはなぜですか?それともそれでしょうか、そして私はどうすればいいのか分かりませんか?

4

6 に答える 6

45

これはおそらく

static const double[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9};

と言っているのと同じです。

static const double[] arr = new double[]{ 1, 2, 3, 4, 5, 6, 7, 8, 9};

const に割り当てられる値は ... const でなければなりません。すべての参照型は定数ではなく、配列は参照型です。

私の調査によると、解決策は静的読み取り専用を使用することでした。または、あなたの場合、固定数の double を使用して、すべてに個別の識別子を付けます。


編集 (2): ちょっとしたサイドノードです。どの型も const を使用できますが、それに割り当てられる値は const でなければなりません。参照型の場合、割り当てることができるのは null だけです。

static const double[] arr = null;

しかし、これはまったく役に立たない。文字列は例外です。これらは、属性引数に使用できる唯一の参照型でもあります。

于 2009-07-10T14:25:08.110 に答える
39

MSDN から ( http://msdn.microsoft.com/en-us/library/ms228606.aspx )

定数式は、コンパイル時に完全に評価できる式です。参照型 [配列] の null 以外の値を作成する唯一の方法は new 演算子を適用することであり、new 演算子は定数式では許可されていないため、参照型の定数に可能な唯一の値文字列以外の型は null です。

于 2009-07-10T14:26:31.633 に答える
9

C#でconst配列を使用する方法はありません。配列の内容が変更されないようにするには、インデクサーやプロパティなどを使用する必要があります。クラスのパブリックサイドを再評価する必要があるかもしれません。

ただし、指摘するだけです...静的読み取り専用-IS NOT CONST-

これは完全に有効であり、あなたが望んでいたものではありません:

class TestClass
{
    public static readonly string[] q = { "q", "w", "e" };
}

class Program
{
    static void Main( string[] args )
    {
        TestClass.q[ 0 ] = "I am not const";
        Console.WriteLine( TestClass.q[ 0 ] );
    }
}

アレイを保護する他の方法を見つける必要があります。

于 2010-04-22T18:42:57.017 に答える
3

定数または読み取り専用にする必要がある理由がわかりません。配列全体を本当に不変にしたい場合、単純な定数/読み取り専用キーワードは役に立ちません。さらに悪いことに、間違った方向に進む可能性もあります。

不変でない参照型の場合、それらを読み取り専用にすることは、変数自体を再割り当てできないことを意味しますが、コンテンツは変更可能です。以下の例を参照してください。

readonly double[] a = new double[]{1, 2, 3};
...
a = new double[] {2,3}; // this won't compile;
a[1] = 4; // this will compile, run and result the array to {1, 4, 3}

コンテキストに応じて、いくつかの解決策がある可能性があります。そのうちの 1 つは、実際に double のリストが必要な場合、 List a = new List() {1,2,3,4,5}.AsReadOnly(); です。double のコンテンツ読み取り専用リストが表示されます。

于 2010-04-22T20:33:10.847 に答える
2

問題は、定数 double の配列ではなく、double の定数配列を宣言していることです。C# で配列が機能する方法のため、定数の配列を持つ方法はないと思います。

于 2009-07-10T14:26:26.780 に答える
1

コンパイラ エラーは、それができない理由を正確に示しています。

「arr」は「double[]」型です。
文字列以外の参照型の const フィールドは、null でのみ初期化できます。

于 2009-07-10T14:25:26.813 に答える