私はいくつかの定数を使用しています。私の計画は、定数を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値の配列を宣言させないのはなぜですか?それとも、どうなるのか、どうすればいいのかわからないのですか?
MSDNから( http://msdn.Microsoft.com/en-us/library/ms228606.aspx )
定数式は、コンパイル時に完全に評価できる式です。参照型[配列]のnull以外の値を作成する唯一の方法は、new演算子を適用することであり、constant-expressionではnew演算子が許可されていないため、参照の定数の唯一の可能な値文字列以外の型はnullです。
これはおそらく
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;
しかし、これはまったく役に立ちません。文字列は例外です。これらは、属性引数に使用できる唯一の参照型でもあります。
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 ] );
}
}
アレイを保護する他の方法を見つける必要があります。
定数または読み取り専用にする必要がある理由はわかりません。配列全体を不変にしたい場合は、単純な定数/読み取り専用キーワードでは役に立たず、さらに悪いことに、間違った方向に進む可能性もあります。
不変でない参照型の場合、読み取り専用にすることは、変数を再割り当てできないことを意味します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();ダブルのコンテンツ読み取り専用リストが表示されます。
問題は、定数doubleの配列ではなく、doubleの定数配列を宣言していることです。 C#では配列が機能するため、定数の配列を持つ方法はないと思います。
コンパイラエラー は、実行できない理由を正確に示しています。
「arr」のタイプは「double []」です。
文字列以外の参照型のconstフィールドは、nullでのみ初期化できます。