日期:2014-05-17  浏览次数:21204 次

【求教】字段初始值无法引用非静态字段、方法的问题
为什么
 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;
        }