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