【求教】字段初始值无法引用非静态字段、方法的问题

_lily 2013-04-18 09:16:07
为什么
class a
{
int i= 4;
int j = i;//提示错误,字段初始值无法引用非静态字段、方法....
public void test()

//这里就可以
int q=4;
int p=q;

}

另外在Java里,就没有以上的错误提示,谢谢高人指点
...全文
2142 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Ailoverer 2014-07-11
  • 打赏
  • 举报
回复
引用 1 楼 Jia_H 的回复:
因为初始化的时候顺序会和你代码有差异,这样就会有问题。 你把对应代码放到构造函数中就没有问题了。
正解!
_lily 2013-04-19
  • 打赏
  • 举报
回复
好像有点明白了,下次去问问学长们
  • 打赏
  • 举报
回复
静态字段的赋值动作会在静态构造函数中完成。 实例化的字段会在非静态构造函数中实例化。 一般来书静态构造函数的执行早于非静态构造函数。 也就是说,在引用静态变量时其实实在非静态构造函数对其赋值。这个时候静态构造函数已经有值了。

        static int i;
        int j = i;
        static a()
        {

            i = 0;
        }
        protected a()
        {
            j= i;
        }
_lily 2013-04-19
  • 打赏
  • 举报
回复
引用 7 楼 u010286221 的回复:
原因是:编译器在进行编译时,会进行一些优化操作。 但是编译器无法保证在初始化变量j时,变量i已经从内存栈中分配了内存. 正如编译器的提示:"错误 1 字段初始值设定项无法引用非静态字段、方法或属性" 因为静态成员(字段,方法,属性)会在所有实例成员创建以前创建,所以在 private int j = i; 这里如果 i 是一个静态变量就不会有问题。 ……
那个我上面的想法是不是一样呢
艾伦图灵 2013-04-18
  • 打赏
  • 举报
回复
原因是:编译器在进行编译时,会进行一些优化操作。 但是编译器无法保证在初始化变量j时,变量i已经从内存栈中分配了内存. 正如编译器的提示:"错误 1 字段初始值设定项无法引用非静态字段、方法或属性" 因为静态成员(字段,方法,属性)会在所有实例成员创建以前创建,所以在 private int j = i; 这里如果 i 是一个静态变量就不会有问题。
_lily 2013-04-18
  • 打赏
  • 举报
回复
引用 4 楼 sp1234 的回复:
引用 1 楼 Jia_H 的回复:因为初始化的时候顺序会和你代码有差异,这样就会有问题。 你把对应代码放到构造函数中就没有问题了。 是这样的。在c#中写 int i= 4; 那只是一个“语法糖”,它其实是:C# code?123456789 class a { int i; public void test() { ……
我是不是可以这样理解: 因为这样是正确的, class a { static int i; int j = i; } 是不是可以理解为,在声明class a时,因为static 是静态的,已经生成实例,所以可以用于j。 如果没有static,因为i仅仅被声明,而没有实例,在声明j时因为无法识别i,而无法声明。 而在类内的方法 class a { public void test() { int q; int p=q; } } 因为test()只在生成class a实例才会被调用,所以编译时可以顺利进行。。 ----- 可能表达的不是很专业,见谅 --- 而对于java 可能是另外一套规则了
  • 打赏
  • 举报
回复
写错了! public void test() --> public a() 而不是 test()
  • 打赏
  • 举报
回复
引用 1 楼 Jia_H 的回复:
因为初始化的时候顺序会和你代码有差异,这样就会有问题。 你把对应代码放到构造函数中就没有问题了。
是这样的。在c#中写 int i= 4; 那只是一个“语法糖”,它其实是:
 class a
     {
         int i;
      public void test()
      {
          i = 4;
        .......其它语句。
      }
    }
编译器规定了,在声明(仅仅是声明,而不是执行)初始值时,是不允许使用其它变量的。
  • 打赏
  • 举报
回复
http://msdn.microsoft.com/zh-cn/library/vstudio/83fhsxwc.aspx 注意规定了语法规则:请记住:在 C# 中不允许使用未初始化的变量。 这样规定是有理由的。当然如果你不“领情”,那么可以不用c#。
_lily 2013-04-18
  • 打赏
  • 举报
回复
引用 1 楼 Jia_H 的回复:
因为初始化的时候顺序会和你代码有差异,这样就会有问题。 你把对应代码放到构造函数中就没有问题了。
求详细。还有java里的问题,万分感谢
Jia_H 2013-04-18
  • 打赏
  • 举报
回复
因为初始化的时候顺序会和你代码有差异,这样就会有问题。 你把对应代码放到构造函数中就没有问题了。

110,537

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧