class myclass
{
  int x = 10;
  int y = this.x;
}
编译以后是不是变成下面的形式了啊
class myclass
{
  int x;
  int y;
  myclass()//构造函数
  {
    x = 10;
    y = this.x;
  }
}
如有错误,请指正

解决方案 »

  1.   

    class myclass
    {
      int x = 10;
      int y = this.x;
    }這樣能編譯通過嗎?
      

  2.   

    编译后用Reflector看看不就知道了:)http://www.aisto.com/roeder/dotnet/
      

  3.   

    用Reflector反编译后,初始化操作被移到构选函数里面去了。在C++里面,
    class myclass
    {
      int x = 10;
      int y = this.x;
    }是不行,
    所有初始化操作只能在构造函数里面才可以。
      

  4.   

    to sskset(断点) :
    是不能通过啊,您能说说为什么不能通过啊,我发这个贴的最终目的就是要各位高手帮我解决这个
    问题的(我要知道原理)。
      

  5.   

    内存还为分配给mylass,所以不行,构造函数以后就有了具体内存分配了,所以就可以用了,个人观点。别拍砖
      

  6.   

    虽然编译后所有filed的初始化工作都被放到了构造函数的开头
    但由于不能保证所有field的初始化顺序,C#编译器禁止在一个field的初始化语句中直接引用另一个field的值但是属性(property)可以,因为它本质上是方法,不存在这个问题
      

  7.   

    to  nocan(干啥啥不行):
    一个类的执行的循序应该是:
    分配内存-》初始化默认值-》调用构造器
    所以,应该不是未分配内存引起的
      

  8.   

    to Sunmast(速马/Maybe I'm Amazed) :
    初始化循序是无所谓的,
    因为“y = this.x”是在x和y都在
    初始化默认值(0)以后执行的,
    所以他们的循序无所谓(至少在编译的时候不会出错),
    如果x比y先初始化,y就得到10
    反之,y就得到x的默认初始化值0;
      

  9.   

    你说的没错,但是这会带来没有必要的复杂性,如果你这样写:
    int x = y;
    int y = 5;这样如果通过编译并执行,x的值应该是0
    但是你没仔细想的话,或者一个新手,肯定会被迷惑,以为应该是5所以C#编译器干脆选择了视这种代码为错误,我想这是明智的选择