【求教】字段初始值无法引用非静态字段、方法的问题
为什么
class a
{
int i= 4;
int j = i;//提示错误,字段初始值无法引用非静态字段、方法....
public void test()
{
//这里就可以
int q=4;
int p=q;
}
}
另外在Java里,就没有以上的错误提示,谢谢高人指点
Java
C#
类
------解决方案--------------------因为初始化的时候顺序会和你代码有差异,这样就会有问题。
你把对应代码放到构造函数中就没有问题了。
------解决方案--------------------http://msdn.microsoft.com/zh-cn/library/vstudio/83fhsxwc.aspx
注意规定了语法规则:请记住:在 C# 中不允许使用未初始化的变量。
这样规定是有理由的。当然如果你不“领情”,那么可以不用c#。
------解决方案--------------------
是这样的。在c#中写 int i= 4; 那只是一个“语法糖”,它其实是:
class a
{
int i;
public void test()
{
i = 4;
.......其它语句。
}
}
编译器规定了,在声明(仅仅是声明,而不是执行)初始值时,是不允许使用其它变量的。
------解决方案--------------------写错了!
public void test() --> public a()
而不是 test()
------解决方案--------------------原因是:编译器在进行编译时,会进行一些优化操作。
但是编译器无法保证在初始化变量j时,变量i已经从内存栈中分配了内存.
正如编译器的提示:"错误 1 字段初始值设定项无法引用非静态字段、方法或属性"
因为静态成员(字段,方法,属性)会在所有实例成员创建以前创建,所以在
private int j = i;
这里如果 i 是一个静态变量就不会有问题。
------解决方案--------------------静态字段的赋值动作会在静态构造函数中完成。
实例化的字段会在非静态构造函数中实例化。
一般来书静态构造函数的执行早于非静态构造函数。
也就是说,在引用静态变量时其实实在非静态构造函数对其赋值。这个时候静态构造函数已经有值了。
static int i;
int j = i;
static a()
{
i = 0;
}
protected a()
{
j= i;
}