代码之家  ›  专栏  ›  技术社区  ›  Ash Burlaczenko

为什么vs认为这个说法总是正确的?

  •  4
  • Ash Burlaczenko  · 技术社区  · 15 年前

    我有这个if声明-

    if (!((main.property == 1)||(main.property == 2)))
    {
       ...
    }
    

    main.property是一个0、1、2或98字节。

    视觉工作室说这句话总是对的,但我不明白为什么?

    如果属性是1或2,这不应该是错误的。

    提前谢谢。

    编辑:添加的代码

    文件1.CS

    private void Upload(DataSet ds)
    {
        Main main = CreateMain(ds); //This is tested and works correctly
        if(ValidateDate(main))
        {
            ...
        }
    }
    

    文件2.CS

    internal static bool ValidateData(Main main, ...)
    {
        if (!((main.property == 1)||(main.property == 2)))
        {
            ...
        }
    }
    

    编辑:添加的代码

    如果我这样做,错误就会消失。-

    internal static bool ValidateData(Main main, ...)
    {
         main.property = 0; //Or = any number
         if (!((main.property == 1)||(main.property == 2)))
         {
              ...
         }
    }
    

    我猜vs认为它没有初始化,但我百分之百肯定。

    4 回复  |  直到 11 年前
        1
  •  2
  •   Guge    15 年前

    我写了这个小程序来检查它:

        class Program
    {
        static void Main(string[] args)
        {
            test(0);
            test(1);
            test(2);
            test(3);
            Console.ReadLine();
        }
    
        private static void test(int p)
        {
            bool b1 = (!((p == 1) || (p == 2)));
            bool b2 = (p != 1 && p != 2);
            Console.Out.WriteLine("{0} {1} {2}", b1, b2, b1 == b2);
        }
    }
    

    君士坦丁的抄本似乎是对的,但这两种表述都不总是对的,也不总是错的。

        2
  •  1
  •   stakx - no longer contributing Saravana Kumar    15 年前

    前P.S. 受到乔恩·斯基特上述评论的启发, 我建议您执行以下操作:

    • (可选:创建当前代码的备份。)
    • 通过逐渐删除部分代码直到警告消失,简化代码。*
    • 一旦警告消失,您将知道代码的哪些部分导致了错误(即您最后删除的部分),然后您可能能够理解它。

    ( 这个建议是从哪里来的? 你已经看到你可以通过 添加 代码。我认为当你做相反的事情时,你对这个问题的理解会更好,也就是说。 去除 代码,以便找到这个问题的核心。)


    main.property 只能有0、1、2和98的值,并且您已经说过您的代码( CreateMain )在这方面工作正常。

    因此,我的猜测是vs假设 主要性能 永远是0。我不知道为什么会得出这样的结论。也许它认为它尚未初始化。

    我写了一些类似于你的代码,但我没有得到警告——我甚至在声明时都没有得到警告。 Main.property 作为 readonly 并将其初始化为0。因此,您可能会遇到这样一种情况:VS的代码分析/调试器发生故障。

    可能(尽管不太可能)的原因考虑:

    • 有代码路径吗 主要性能 未初始化?

    • 自从 主要性能 属于类型 byte (根据您自己的说法),该警告是由下溢或溢出分配引起的吗?(如果将类型更改为 int ?)

    • 可能是那样吗 main 隐藏另一个变量 主要的 ?

        3
  •  0
  •   NGRhodes    15 年前

    单步执行代码,找出main.property值是什么。

    我也有类似的问题,因为价值是 无效的 默认值。

        4
  •  0
  •   Jesse C. Slicer    15 年前

    由于您声明main.property是一个0、1、2或98字节,所以应该在该方法的开头声明该条件,如下所示:

    internal static bool ValidateData(Main main, ...)
    {
        System.Diagnostics.Debug.Assert(main.property == 0 || main.property == 1 || main.property ==2 || main.property == 98);
        if (!((main.property == 1)||(main.property == 2)))
        {
            ...
        }
    }