为什么以下工作?
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(?)。如果它是常数并且为空,它将如何被初始化?
答案 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]
我希望能帮到你
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
不能在常量表达式中使用,因为它无法在编译时进行求值。