none
一个严重BUG,调试环境VS2015 update2 RRS feed

  • 问题

  • 二维数组在储存sbyte类型枚举后,取出来的是byte,也就是-1会变成255.

    一开始在VS2015 update1下调试,发现问题后升级到update2,问题依然存在。

    以下是测试代码。

    namespace FuckMe
    {
        class Program
        {
            enum State : sbyte { OK = 0, BUG = -1 }
            static void Main(string[] args)
            {
                var s = new State[1, 1];
                s[0, 0] = State.BUG;
                State a = s[0, 0];
                if (a != s[0, 0])
                    Console.WriteLine("Fuck me!!!!");
                if (s[0, 0] > 0)
                    Console.WriteLine("Fuck me again!!!!");
                Console.WriteLine((sbyte)s[0, 0]);
                Console.WriteLine((sbyte)State.BUG);
                Console.ReadKey();
            }
        }
    }



    • 已编辑 popyoung 2016年4月13日 1:36
    2016年4月13日 1:32

答案

  • 這個問題很詭異, 經過了一些朋友們的討論, 我們使用以下的程式碼測試 (Visual Studio 2015 Update 2)

    測試步驟:

    (1) 開啟 Visual Studio , Framework 目標設為 4.5 , 建立一個新的 Console project (同時也建立新 solution ),

    執行結果 : -1,255,-1

    (2) 使用 (1) 所建立的 project , 將 Framework 目標設為 4.0 , 執行結果 -1,-1,-1

    (3) 再將 Framework 目標設為 4.5 , 執行結果居然還是 -1,-1,-1

    (4) 在這個 solution 中加入一個新建的 console project , 將 Framework 目標設定為 4.5 ,  執行結果是 -1,255,-1

    所以奇怪的就是, 只要把 Framework 設定為 4.0 , 執行一次程式會得到正確的結果, 再改回來 4.5 , 再執行一次得到的也是正確的結果

    class Program
        {
            static void Main(string[] args)
            {
                State[] data1 = new State[] { State.On };
                Console.WriteLine((sbyte)data1[0]);
    
                State[,] data2 = new State[,] { { State.On, State.On } };
                Console.WriteLine((sbyte)data2[0, 0]);
    
                State x = data2[0, 0];
                Console.WriteLine((sbyte)x);
    
                Console.ReadLine();
                
            }
    
            public enum State : sbyte
            {
                On = -1,
                Off = 0
            }
        }

     


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2016年4月17日 9:35

全部回复

  • 你好 Popyoung,

    我用vs2015 update 2测试了一下你的代码发现确实有这样的问题。同时我去掉enum后测试了类似的代码发现问题就没有了。 代码如下:

    var s = new sbyte[1, 1];
                s[0, 0] = -1;
                var a = s[0, 0];
    
                if (a != s[0, 0])
                    Console.WriteLine("aaaaa!!!!");
                if (s[0, 0] > 0)
                    Console.WriteLine("bbbbb!!!!");
    所以我猜测问题可能出在枚举的!= 操作符上,我建议你去Microsoft Connect 上发布这个问题。 http://connect.microsoft.com/

    另外,有个比较简单的方式可以解决这个问题,只需要把enum继承的类型改成System.Int32

    希望能够帮到你


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2016年4月14日 5:56
    版主
  • 這個問題很詭異, 經過了一些朋友們的討論, 我們使用以下的程式碼測試 (Visual Studio 2015 Update 2)

    測試步驟:

    (1) 開啟 Visual Studio , Framework 目標設為 4.5 , 建立一個新的 Console project (同時也建立新 solution ),

    執行結果 : -1,255,-1

    (2) 使用 (1) 所建立的 project , 將 Framework 目標設為 4.0 , 執行結果 -1,-1,-1

    (3) 再將 Framework 目標設為 4.5 , 執行結果居然還是 -1,-1,-1

    (4) 在這個 solution 中加入一個新建的 console project , 將 Framework 目標設定為 4.5 ,  執行結果是 -1,255,-1

    所以奇怪的就是, 只要把 Framework 設定為 4.0 , 執行一次程式會得到正確的結果, 再改回來 4.5 , 再執行一次得到的也是正確的結果

    class Program
        {
            static void Main(string[] args)
            {
                State[] data1 = new State[] { State.On };
                Console.WriteLine((sbyte)data1[0]);
    
                State[,] data2 = new State[,] { { State.On, State.On } };
                Console.WriteLine((sbyte)data2[0, 0]);
    
                State x = data2[0, 0];
                Console.WriteLine((sbyte)x);
    
                Console.ReadLine();
                
            }
    
            public enum State : sbyte
            {
                On = -1,
                Off = 0
            }
        }

     


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2016年4月17日 9:35