web-dev-qa-db-ja.com

C#でconst double []を宣言しますか?

私はいくつかの定数を使用しています。私の計画は、定数を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値の配列を宣言させないのはなぜですか?それとも、どうなるのか、どうすればいいのかわからないのですか?

46
David Božjak

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

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

40
JohnFx

これはおそらく

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でなければなりません。すべての参照型は定数ではなく、配列は参照型です。

私の研究が示した解決策は、静的な読み取り専用を使用することでした。または、固定数の倍精度の場合、すべてに個別の識別子を付けます。


Edit(2):小さなサイドノード、すべてのタイプはconstを使用できますが、それに割り当てられる値はconstでなければなりません。参照型の場合、割り当てることができるのはnullのみです。

static const double[] arr = null;

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

46
Dykam

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 ] );
    }
}

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

9
Karl Strings

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

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

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();ダブルのコンテンツ読み取り専用リストが表示されます。

3
louis

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

2
Yohnny

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

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

1
LukeH