Const多维数组初始化

use*_*673 12 c# arrays const

为什么以下工作?

class A
{
    public int[,] i = { { 1, 2, 3 }, { 1, 2, 3 }, { 1, 2, 3 } };

    static void Main(string[] args)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

以下不是吗?

class A
{
    public const int[,] i = { { 1, 2, 3 }, { 1, 2, 3 }, { 1, 2, 3 } };

    static void Main(string[] args)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

它不允许为除string之外的const引用类型分配除null之外的任何其他类型.由于它是一个数组(引用),因此必须将其指定为null(?).如果它是常数并且为空,它将如何初始化?

小智 15

如果我没记错的话,这是C#语言设计的一部分.const保留用于可以在编译时推断其内容的项目,即在程序构建之前(期间)然后运行.C#中的所有数组都是运行时数组(它们的长度是在程序运行时确定的,而不是在此之前确定的)因此它们不能被制作成const字段.我觉得这是C#的限制,但这就是他们决定这样做的方式.

引用类型可以为null的原因是它null是一个常量值,而初始化程序(在运行时生成)则不是.null内置于语言中,因此通过该逻辑,其值始终是已知的(因此可用于编译时引用类型).

编辑:

但是,您应该可以创建一个静态表,它将在任何其他代码使用或需要时进行初始化:

public static int[,] i = { { 1, 2, 3 }, { 1, 2, 3 }, { 1, 2, 3 } };
       ^ Static Keyword
Run Code Online (Sandbox Code Playgroud)

您可以像访问它一样访问它(如果它仍然存在class A):

A.i[0, 1]
Run Code Online (Sandbox Code Playgroud)

我希望能帮到你

要了解更多信息,请查看MSDN:http://msdn.microsoft.com/query/dev11.query? appId = Dev11IDEF1& l = EN- US&k = k(CS0134) ; k(TargetFrameworkMoniker-.NETFramework,Version%3Dv4.5) &RD =真

EDITEDIT:如果你需要将静态表格铆接到代码中,并且在初始化之后永远不让任何人更改它,那么readonly就是为此目的的关键字:

public static readonly int[,] i = { { 1, 2, 3 }, { 1, 2, 3 }, { 1, 2, 3 } };
       ^ Static ^Readonly Keywords
Run Code Online (Sandbox Code Playgroud)

请记住,它不会阻止您将内容重新分配到这些插槽中,但它与C#可以提供的一样固定,除了每次创建属性或返回新数组.