在C#中声明一个const double []?

Dav*_*jak 46 c# static const readonly

我使用了几个常量,我的计划是将它们放在const数组的双精度数中,但是编译器不会让我这么做.

我试过这样声明:

const double[] arr = {1, 2, 3, 4, 5, 6, 73, 8, 9 };
Run Code Online (Sandbox Code Playgroud)

然后我决定将其声明为静态只读:

static readonly double[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9};
Run Code Online (Sandbox Code Playgroud)

但问题仍然存在.为什么编译器不允许我声明一个const值数组?或者它会,我只是不知道如何?

Dyk*_*kam 46

这可能是因为

static const double[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9};
Run Code Online (Sandbox Code Playgroud)

实际上和说法一样

static const double[] arr = new double[]{ 1, 2, 3, 4, 5, 6, 7, 8, 9};
Run Code Online (Sandbox Code Playgroud)

赋给const的值必须是... const.每个引用类型都不是常量,数组是引用类型.

我的研究显示的解决方案是使用静态只读.或者,在具有固定数量的双精度的情况下,为所有内容提供单独的标识符.


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

static const double[] arr = null;
Run Code Online (Sandbox Code Playgroud)

但这完全没用.字符串是例外,它们也是唯一可用于属性参数的引用类型.

  • String是一个引用类型,你可以拥有常量字符串...... (4认同)

Joh*_*nFx 40

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

constant-expression是一个可以在编译时完全评估的表达式.因为创建引用类型[数组]的非空值的唯一方法是应用new运算符,并且因为常量表达式中不允许使用new运算符,所以引用常量的唯一可能值 - string以外的类型为null.


Kar*_*ngs 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 ] );
    }
}
Run Code Online (Sandbox Code Playgroud)

您需要找到其他方法来保护您的阵列.