在C#中声明一个const double ?

我有几个常量,我使用,我的计划是把他们在一个双数的常量数组,但编译器不会让我。

我试过这样的声明:

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

然后我决定把它声明为static:

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

但问题依然存在。 为什么编译器不能让我声明一个常量值数组? 还是会的,我只是不知道如何?

从MSDN( http://msdn.microsoft.com/en-us/library/ms228606.aspx

常量expression式是可以在编译时充分评估的expression式。 因为创build引用types[数组]的非空值的唯一方法是应用new运算符,并且由于new运算符不允许在常量expression式中,所以reference-type常量的唯一可能值string以外的types为空。

这可能是因为

 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。 每个引用types不是常量,数组是引用types。

我的研究显示的解决scheme是使用静态只读。 或者,在你的情况下有一个固定数量的双打,给一切个人的标识符。


编辑(2):一个小的sidenode,每个types都可以使用const,但赋值给它的值必须是const。 对于引用types,唯一可以分配的是null:

 static const double[] arr = null; 

但是这完全没用。 string是例外,这些也是唯一可以用于属性参数的引用types。

在C#中没有办法使用const数组。 您需要使用索引器,属性等来确保数组的内容不被修改。 您可能需要重新评估class级的公共部分。

只是要指出,虽然…静态只读 – 不是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 ] ); } } 

您将需要find其他方法来保护您的arrays。

我不知道为什么你需要使其不变或只读。 如果你真的想让整个数组不变,那么一个简单的常量/只读关键字不会帮助你,更糟糕的是,它也可能使你转向错误的方向。

对于任何非不可变的引用types,使它们只读只意味着你永远不能重新分配variables本身 ,但内容仍然是可改变的。 看下面的例子:

 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} 

根据你的上下文,可能有一些解决scheme,其中之一是,如果你真正需要的是双列表,List a = new List(){1,2,3,4,5} .AsReadOnly(); 会给你一个双倍的内容只读列表。

问题是你正在声明一个double常量数组,而不是一个常量双精度数组。 由于数组在C#中的工作方式,我不认为有一个方法来获得一个常量的数组。

编译器错误告诉你为什么你不能这样做:

'arr'的types是'double []'。
除string以外的引用types的const字段只能用null初始化。