2013-12-23 39 views
1

以下工作:我的数组声明有什么问题?

int[] numbers = new int[2]; 

下列不:

int Size = 2; 
int[] numbers = new int[Size]; 

错误: “A字段初始不能引用非静态字段,方法或属性”

我知道这一定是我做了一些愚蠢的事情,但无法弄清楚它究竟是什么。

+1

由于错误消息明确暗示,您不能使用字段,方法或属性来设置大小。你需要一个静态常量,大小不能动态改变。 –

回答

4

您可以通过常量赋予数组的大小,但不能变量,因为如果在类级别将方法声明在方法的外侧,则无法在类级别给出数组的大小。 C#不保证一个类中的字段被初始化的顺序,因此您不能使用一个非静态字段来初始化方法以外的另一个非静态字段,即reference

const int Size = 2; 
int[] numbers = new int[Size]; 
void SomeFun() 
{ 

} 

如果你在某种方法中声明它,那么你将不会得到错误。

void SomeFun() 
{ 
    int Size = 2; 
    int[] numbers = new int[Size]; 
} 

如果您在运行时的未知集合大小,则可以使用list而不是array。

List<int> lst = new List<int>(); 
+1

这是XNA专用的东西吗?因为在常规的C#中它不需要是'const'。 – Thorarin

+0

谢谢。当我被允许时,会提出答案。 – user2056166

+0

当然,您可以用变量初始化数组大小。报告错误的问题是值作为初始值设定项赋予类字段。编译器不保证初始化器的执行顺序,所以可变的Size在使用之前可能不会被初始化。但是,它允许在非静态初始化器中使用静态字段,因为静态初始化器保证在类加载阶段执行,即严格在任何非静态字段初始化之前执行。 –

0

您不能使用实例变量来初始化另一个实例变量。不能保证“大小”变量将在'数组'之前被初始化。字段的初始值需要使用常量 - 这不像限制那样;他们也可以引用静态字段,方法或属性。

1

把这些初始化到构造函数:

public class MyClass 
{ 

    const int Size; 
    int[] numbers; 

    public MyClass() 
    { 
     this.Size = 2; 
     this.numbers = new int[this.Size]; 
    } 

} 

这样您提供的订单保证在初始化应执行。