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)
但这完全没用.字符串是例外,它们也是唯一可用于属性参数的引用类型.
Joh*_*nFx 40
来自MSDN(http://msdn.microsoft.com/en-us/library/ms228606.aspx)
constant-expression是一个可以在编译时完全评估的表达式.因为创建引用类型[数组]的非空值的唯一方法是应用new运算符,并且因为常量表达式中不允许使用new运算符,所以引用常量的唯一可能值 - string以外的类型为null.
在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)
您需要找到其他方法来保护您的阵列.