Почему В.С. считает, что это утверждение всегда верно? - PullRequest
4 голосов
/ 17 августа 2010

У меня есть заявление 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 ]

2 голосов
/ 17 августа 2010

Я написал эту маленькую программу, чтобы проверить:

    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 голос
/ 17 августа 2010

Pre-PS: Вдохновленный комментарием Джона Скита выше, Я предлагаю вам сделать следующее:

  • (Необязательно: Создатьрезервная копия вашего текущего кода.)
  • Упростите свой код, постепенно удаляя его части, пока предупреждение не исчезнет. *
  • Как только предупреждение исчезнет, ​​вы узнаетекакие части вашего кода вызвали ошибку (а именно ту часть, которую вы удалили последней), и тогда вы сможете ее понять.

( Откуда этот совет? → Вы уже видели, что вы можете снять предупреждение, добавив , добавив код . Я думаю, что ваше понимание проблемы будет еще лучше, если вы сделаете обратное, то есть , удалив код чтобы понять суть этой проблемы.)


main.property может иметь только значения 0, 1, 2 и 98, и вы сказали, что ваш код (CreateMain) правильно работает в этом отношении.

Таким образом, я предполагаю, что VS предполагает, что main.property всегда равно 0. WПридется прийти к такому выводу, я не знаю.Возможно, он думает, что он не был инициализирован.

Я написал некоторый код, похожий на ваш, и я не получаю это предупреждение - я даже не получаю предупреждение, когда объявляю Main.property как readonly и инициализируйте его равным 0. Таким образом, вы, вероятно, попали в одну из следующих ситуаций, когда анализ кода VS / неисправности отладчика.

Возможные (хотя и маловероятные) причины для рассмотрения:

  • Есть ли какой-нибудь путь кода, где Main.property не инициализирован?

  • Поскольку Main.property имеет тип byte (по вашему мнению), может ли это бытьчто предупреждение каким-то образом вызвано переполнением или присвоением переполнения?(Что произойдет, если вы измените тип на int?)

  • Может быть, main затеняет другую переменную main?

0 голосов
/ 17 августа 2010

Поскольку вы утверждаете, что 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)))
    {
        ...
    }
}
0 голосов
/ 17 августа 2010

Просмотрите ваш код, чтобы узнать значение main.property.

У меня была похожая проблема, и это потому, что значение было null значением по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...