public class GameMoves {
        private IEnumerator cross;
        private IEnumerator circle;        public GameMoves() {
            cross = Cross();
            circle = Circle();
        }        private int move = 0;
        const int MaxMoves = 9;        public IEnumerator Cross() {
            while (true) {
                Console.WriteLine("Cross, move {0}", move);
                if (++move >= MaxMoves)
                    yield break;
                yield return circle;
            }
        }        public IEnumerator Circle() {
            while (true) {
                Console.WriteLine("Circle, move {0}", move);
                if (++move >= MaxMoves)
                    yield break;
                yield return cross;
            }
        }
    }在Main中调用:
var game = new GameMoves();
            IEnumerator enumerator = game.Cross();
            while (enumerator.MoveNext())
            {
                enumerator = enumerator.Current as IEnumerator;
            }问题,请问在main中语句:
 var game = new GameMoves();
为什么不调用那两个方法:Cross() 和"Circle()?

解决方案 »

  1.   

    var game = new GameMoves().
    new GameMoves()创建GameMoves类的对象。
    game = new GameMoves().把创建的对象的地址传给game这个引用。
    没见到有调用方法的语句啊。
      

  2.   

    两个方法:Cross()、 Circle()互相调用,结果为
    Cross,move 0
    Circle,move 1
    Cross,move 2
    Circle,move 3
    Cross,move 4
    Circle,move 5
    Cross,move 6
    Circle,move 7
    Cross,move 8
    楼主想要什么结果?
      

  3.   

    IEnumerator enumerator = game.Cross();
    我是觉得,这行的时候,应该也是会调用"Cross()"和"Circle()"
    因为对于我测试的方法,如:
    public A() {
                _val = IncreaseValue();
            }        public int IncreaseValue() {
                return _val++;
                //return Val++;
            }        public static int ShowI() {
                A a = new A();
                return a.GetConstont();
            }
    这样是会调用的...
      

  4.   


    不是,关键是public GameMoves() {
                cross = Cross();
                circle = Circle();
            }
    里面不是有两个方法么...我的意思是太也应该调用那两个方法...
    就像我在 4 楼 的下面的代码一样....不都是一个类型么...
      

  5.   

    这里让你困惑的关键是yield关键字。编绎器对包含这样语句的方法跟普通方法的处理不一样。所以会导致这样的结果。你试试,把方法
    public IEnumerator Cross() {
                while (true) {
                    Console.WriteLine("Cross, move {0}", move);
                    if (++move >= MaxMoves)
                        yield break;
                    yield return circle;
                }
            }
    的返回值改成IEnumerable.然后修改一下构造函数: 
    public GameMoves() {
                foreach(object o in Cross()){}
                cross = Cross();
                circle = Circle();
            }
    这样Cross才会被调用了。