Const多维数组初始化

时间:2013-04-12 00:21:43

标签: c# arrays const

为什么以下工作?

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

    static void Main(string[] args)
    {
    }
}

以下没有?

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

    static void Main(string[] args)
    {
    }
}

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

3 个答案:

答案 0 :(得分:14)

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

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

编辑:

你应该能够制作一个静态表,它将在任何其他代码使用或需要时被初始化:

public static int[,] i = { { 1, 2, 3 }, { 1, 2, 3 }, { 1, 2, 3 } };
       ^ Static Keyword

你可以像(如果它仍在class A中)那样访问它:

A.i[0, 1]

我希望能帮到你

要了解详情,请查看MSDN:http://msdn.microsoft.com/query/dev11.query?appId=Dev11IDEF1&l=EN-US&k=k(CS0134);k(TargetFrameworkMoniker-.NETFramework,Version%3Dv4.5)&rd=true

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

public static readonly int[,] i = { { 1, 2, 3 }, { 1, 2, 3 }, { 1, 2, 3 } };
       ^ Static ^Readonly Keywords

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

答案 1 :(得分:3)

它不起作用,因为这是对const关键字的限制。

来自MSDN

  

const关键字用于修改字段或本地的声明   变量。它指定字段或本地的值   变量是常量,这意味着它不能被修改。

     

常量表达式是一个可以在编译时完全计算的表达式。因此,引用类型常量的唯一可能值是 string 和   空

如果您尝试定义无法更改的数组,可能应使用readonly关键字,该关键字将对字段或局部变量所做的更改限制为声明或构造函数。

答案 2 :(得分:2)

在编译时评估常量。 Array是引用类型,创建引用类型的唯一方法是使用new关键字(在代码中隐含)。

new不能在常量表达式中使用,因为它无法在编译时进行求值。

请参阅MSDN:http://msdn.microsoft.com/query/dev11.query?appId=Dev11IDEF1&l=EN-US&k=k(CS0134);k(TargetFrameworkMoniker-.NETFramework,Version%3Dv4.5)&rd=true