为什么VS认为这句话总是如此?

时间:2010-08-17 09:29:37

标签: c# visual-studio if-statement

我有这个if语句 -

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

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

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

如果属性为1或2,则不应该为假。

提前谢谢。

编辑:添加了代码

file1.cs

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

file2.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认为它没有初始化,但我是100%肯定的。

4 个答案:

答案 0 :(得分:2)

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

    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);
    }
}

康斯坦丁的转录似乎是正确的,但这两种表达方式都不是真的,也不总是假的。

答案 1 :(得分:1)

Pre-P.S。:受Jon Skeet上述评论的启发,我建议您执行以下操作:

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

这个建议来自哪里?→你已经看到你可以通过添加代码来消除警告。我想你对这个问题有所了解当你做相反的事情时会更好,即删除代码以便找到这个问题的核心。)


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

因此,我的猜测是VS假设main.property总是为0.为什么它应该得出那个结论,我不知道。也许它认为它还没有被初始化。

我写了一些类似于你的代码,我没有收到警告 - 当我将Main.property声明为readonly并将其初始化为0时,我甚至都没有收到警告。因此,你可能会遇到VS'代码分析/调试器出现故障的情况之一。

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

  • 是否有任何未初始化Main.property的代码路径?

  • 由于Main.property的类型为byte(根据您自己),是否可能由于下溢或溢出分配而导致警告? (如果将类型更改为int会怎样?)

  • 可能main影响另一个变量main吗?

答案 2 :(得分:0)

逐步执行代码以找出main.property的值。

我有一个类似的问题,因为该值是 null 的默认值。

答案 3 :(得分:0)

由于您声称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)))
    {
        ...
    }
}