我有这个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%肯定的。
答案 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)))
{
...
}
}