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

时间:2009-07-10 14:18:01

标签: c# static const readonly

我使用了几个常量,我的计划是将它们放在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值数组?或者它会,我只是不知道如何?

6 个答案:

答案 0 :(得分:44)

这可能是因为

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

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


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

static const double[] arr = null;

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

答案 1 :(得分:39)

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

  

常量表达式是一个表达式   可以在。完全评估   编译时间。因为唯一的办法   创建a的非null值   reference-type [数组]是应用new   运营商,因为新的运营商   是不允许的   恒定表达,唯一可能   引用类型常量的值   除了字符串之外是空的。

答案 2 :(得分: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 ] );
    }
}

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

答案 3 :(得分:3)

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

对于任何非不可变引用类型,只读它只意味着您永远不能重新分配变量本身,但内容仍然可以更改。见下面的例子:

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}

根据你的上下文,可能有一些解决方案,其中一个是,如果你真正需要的是double列表,List a = new List(){1,2,3,4,5} .AsReadOnly ();将为您提供内容 - 只读双重列表。

答案 4 :(得分:2)

问题是你要声明一个常量的double数组,而不是一个常量double的数组。由于数组在C#中的工作方式,我认为有一种方法可以得到一个常量数组。

答案 5 :(得分:1)

compiler error告诉您为什么不能这样做:

  

'arr'的类型为'double []'   除string之外的引用类型的const字段只能用null初始化。