Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#中声明常量double[]?_C#_Static_Constants_Readonly - Fatal编程技术网

在C#中声明常量double[]?

在C#中声明常量double[]?,c#,static,constants,readonly,C#,Static,Constants,Readonly,我使用了几个常量,我的计划是将它们放在一个常量数组中,但编译器不允许 我试着这样声明: 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}; 然而,问题仍然存在。为什么编译器不让我声明一个常量值数组?还是会,我只是不知道怎么做?这可能是因为 static const double[] arr

我使用了几个常量,我的计划是将它们放在一个常量数组中,但编译器不允许

我试着这样声明:

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

然而,问题仍然存在。为什么编译器不让我声明一个常量值数组?还是会,我只是不知道怎么做?

这可能是因为

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};
分配给常量的值必须是。。。康斯特。不是每个引用类型都是常量,数组是引用类型

我的研究表明,解决方案是使用静态只读。或者,在使用固定数量的双倍的情况下,为所有内容指定一个单独的标识符


编辑(2): 作为一个小节点,每个类型都可以使用const,但分配给它的值必须是const。对于引用类型,唯一可以指定的是null:

static const double[] arr = null;
但这是完全无用的。字符串是例外,它们也是唯一可用于属性参数的引用类型。

准确地告诉您为什么不能这样做:

“arr”是“double[]”类型。
引用类型不是字符串的常量字段只能用null初始化


问题是您正在声明一个double的常量数组,而不是一个double的常量数组。由于数组在C#中的工作方式,我认为没有办法拥有常量数组。

来自MSDN()

常量表达式是一个表达式 这可以在 编译时。因为只有这样 创建 引用类型[数组]将应用新的 接线员,因为新接线员 是不允许的 常量表达式,唯一可能的 引用类型的常量的值 字符串以外的其他值为空


在C#中不可能有常量数组。您需要使用索引器、属性等来确保数组的内容不被修改。你可能需要重新评估你的课程的公共方面

不过我要指出的是。。。静态只读-不是常量-

这是完全正确的,不是您想要的:

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

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

我不知道为什么需要将其设置为常量或只读。如果您真的想使整个数组不可变,那么简单的constant/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();将为您提供一个内容只读的double列表。

马上。请看:正是这样:字符串是引用类型,可以有常量字符串…澄清:我的意思是,虽然字符串是引用类型,但由于它们是不可变的,所以它们可以是常量。是的,我知道。。。但它指出
数组是一个参考问题。数组的内容并不重要,是吗?