class A
{
    public static int x;
    static A()
    {
        x = B.Y + 1;
    }
}class B
{
    public static int Y = A.x + 1;
    static B()
    {    }
    static void Main()
    {
        Console.WriteLine("X={0},Y={1}",A.x,B.Y);
        Console.Read();
    }
}

解决方案 »

  1.   

    很基础的问题,首先编译器生成代码,初始化静态字段,此时x= 0;y = 1;
    然后执行静态构造函数代码,x= 1+ 1; 注意 静态构造函数代码只执行一次。
    最后结果x =2,y=1 楼主说的答案也写反了。
      

  2.   

    首先编译器生成代码,初始化静态字段,此时x=1;y=0;
    (原因a的构造函数点用B,而B构造函数里是空的,y默认为0,所以x=1,y=0);
    B.Y=1+1;
    y=2;
    看程序猜得~
      

  3.   

    Console.WriteLine("X={0},Y={1}",A.x,B.Y); 
    先执行public   static   int   Y   =   A.x   +   1; 
    因为有A.x所以会调用
     static   A() 
            { 
                    x   =   B.Y   +   1; 
            } 
    而调用A()时,Y的值还没有计算出来,所以此时B.Y=0,从而得出x=1
    然后回到public   static   int   Y   =   A.x   +   1得出Y=2
      

  4.   

    你会发现
    class A
        {
            public static int x;
            A()
            {
                x = B.Y + 1;
            }
        }    class B
        {
            public static int Y = A.x + 1;
            B()
            {        }
            static void Main()
            {
                Console.WriteLine("X={0},Y={1}", A.x, B.Y);
                Console.Read();
            }
        }
    结果x=0,y=1
    因为此时,并没有调用A,B的构造函数,只是用到了定义而已
      

  5.   

    楼主的写法等同于using System;
    class A
    {
        public static int x;//具有初始值0
        static A()
        {
            x = B.Y + 1;
        }
    }class B
    {
        public static int Y;//具有初始值0
        static B()
        {
            Y = A.x + 1;
        }
        static void Main()
        {
            Console.WriteLine("X={0},Y={1}", A.x, B.Y);
            Console.Read();
        }
    }main函数在B里面,所以编译器首先是初始化B
    首先是字段Y,Y是int型,编译器初始化为0 ,然后Y为static,所以编译器接着执行B的静态构造函数,注意一点,构造函数只执行一次
    在static B()里面,Y被赋值为A.X+1,编译器接着去找A.X的值,此时执行A的静态构造函数,x=B.Y+1,因为B的构造函数已经执行了,此时就不执行第二次,Y此时具有
    值是0,所以X=1;然后返回Y=A.X+1,Y=2
    所以答案就是X=1;Y=2;注意两点就可以了:初始化顺序是先字段后构造函数,每个字段都有一个初始的默认值
      

  6.   

    呵呵,4楼的朋友可能没有很好的理解静态变量和静态构造函数的含义,最好亲自调试下就知道是不是你想的那种结果了。
    静态变量是在编译的时候就开始赋值的,而不是当进入到main函数当中才有值。
    静态构造函数也是在main函数调用之前执行且与基构造函数不同,静态构造函数执行且执行一次,上边的例子,比如你写一句A a= new A();这段代码是不会调用static   A() { x   =   B.Y   +   1; } 这段代码的,你可以自己试验。
    当静态构造函数的内容执行完后,才开始执行main函数, Console.WriteLine("X={0},Y={1}",   A.x,   B.Y); 这句仅仅是调用静态变量的值,根本就涉及不到构造函数的问题。
      

  7.   

    同意7楼观点 并补充如下:也是实际调试结果执行顺序如下:public static int x;
    public static int Y = A.x + 1;  //注意 Y=0,没有执行赋值操作
      static A()  //此时调用A的构造函数
            {
                x = B.Y + 1;
            }
    public static int Y = A.x + 1;  //赋值操作
            static B()
            {        }
            static void Main()
            {
                Console.WriteLine("X={0},Y={1}", A.x, B.Y);
                Console.Read();
            }
      

  8.   

    更正点我的错我,经过实际调试验证,证明调用的过程是这样的,
    static class Program
        {
            public static int Y = A.x + 1; 
            static Program() 
            {
                MessageBox.Show("B的构造函数");
            } 
            static void Main()
            {
                MessageBox.Show("x= " + A.x + ",y=" + Program.Y);
            }
        }    class A
        {
            public static int x;
            static A()
            {
                MessageBox.Show("x的值 =" +x.ToString());
                x = Program.Y + 1;
                MessageBox.Show("Y的值 = "+Program.Y.ToString());
                MessageBox.Show("构造结束X ="+x.ToString());
            }
        }此时结果输出为:
    x的值 = 0
    Y的值 = 0
    构造结束X = 1
    B的构造函数
    x= 1,y=2但是当如下面写的时候
    static class Program
        {
            //public static int Y = A.x + 1; 
            public static int Y = 1;
            static Program() 
            {
                MessageBox.Show("B的构造函数");
            } 
            static void Main()
            {
                MessageBox.Show("x= " + A.x + ",y=" + Program.Y);
            }
        }    class A
        {
            public static int x;
            static A()
            {
                MessageBox.Show("x的值 =" +x.ToString());
                x = Program.Y + 1;
                MessageBox.Show("Y的值 = "+Program.Y.ToString());
                MessageBox.Show("构造结束X ="+x.ToString());
            }
        }输出的结果为:
    B的构造函数
    x值 = 0
    Y的值 = 1
    构造结束X = 2
    x=2,y=1由此可看出,调用顺序是这样的,数值型的静态变量初始化都先为0,然后才开始计算,先初始化main函数所在的静态变量和静态构造函数,后初始化其他类中的静态变量和静态构造函数。不过在main函数所在类静态变量初始化过程中遇到了其他类中的静态变量,会先对使用到的静态变量和静态函数做初始化。
    流程就是 先初始化y = a.x +1;因为遇到了a.x 所以转入到 A类,计算A.x的值,此时B.y的值因为还没有计算所以仍然为0,计算结束后,继续执行调用B的静态构造函数。