Если - Или оператор оценивается как ИСТИНА, тогда как на самом деле он должен быть ЛОЖЬ

Не уверен, что мне здесь не хватает .. Должно быть довольно просто ..

tblCurrent НЕ равен NULL tblCurrent.Rows.Count НЕ равен 0

if (tblCurrent != null | tblCurrent.Rows.Count != 0)
{
    //Do something
}
else
{
    // This is what I want
}

Он должен увидеть, что правильным условием является 0, поэтому он должен вернуть false и поместить в блок else? Что мне не хватает?


person Ron    schedule 05.09.2013    source источник
comment
Если tblCurrent не равно нулю, то tblCurrent != null истинно и не перейдет в блок else.   -  person juharr    schedule 05.09.2013
comment
Если tblCurrent != null, это условие всегда будет оцениваться как true. Вы уверены, что не хотите использовать AND (&&)? Кроме того, вы должны использовать || вместо |.   -  person JosephHirn    schedule 05.09.2013
comment
Подумайте об этом - вы просите его проверить, не является ли tblCurrent ненулевым, и, поскольку tblCurrent не равно нулю, угадайте, как он оценивает?   -  person LittleBobbyTables - Au Revoir    schedule 05.09.2013
comment
Пожалуйста, изучите немного, прежде чем размещать вопросы. Вы используете не того оператора.   -  person user823959    schedule 05.09.2013
comment
Да, но у меня также есть условие tblCurrent.Rows.Count! = 0. Если одно из этих условий оценивается как false, я хочу быть в блоке else. И rows.count действительно оценивается как false. Я думал, что одна труба | проверил оба условия   -  person Ron    schedule 05.09.2013
comment
@Ron, побитовое или (|) отличается от условно или (||).   -  person gunr2171    schedule 05.09.2013
comment
Что со всеми этими голосами, чтобы закрыть? Хотя это определенно не сложный вопрос, но это не вопрос проверки руководства или gimmecodez! Я не думаю, что его нужно закрывать без всяких усилий.   -  person Sergey Kalinichenko    schedule 05.09.2013
comment
@LittleBobbyTables Даже прямая логическая логика может быть трудной для кого-то, кто ранее не сталкивался с ней. Мой личный критерий достаточного минимального понимания - публикация соответствующего кода, который компилируется, что сделал OP :-)   -  person Sergey Kalinichenko    schedule 05.09.2013
comment
Чтобы уточнить, я получил эту информацию отсюда stackoverflow.com/questions/1746302/c-sharp-or-operator, который был самым популярным ответом, поэтому я решил, что это моя проблема. Я должен был поискать дальше в разделе комментариев - Спасибо dasblinkenlight за разъяснения.   -  person Ron    schedule 06.09.2013


Ответы (2)


Если tblCurrent не равно null, тогда tblCurrent != null оценивается как true, поэтому общий OR также будет оцениваться как true, потому что OR оценивается как true, если и только если одна или обе его стороны оцениваются как true.

Похоже, ваша логика должна была использовать AND оператор && вместо OR, например:

if (tblCurrent != null && tblCurrent.Rows.Count != 0) {
    ...
} else {
    ...
}

Оператор && сокращает оценку, поэтому вы не получите исключения, даже если tblCurrent равно null.

person Sergey Kalinichenko    schedule 05.09.2013
comment
Оператор && сокращает вычисление, поэтому вы не получите исключения, даже если tblCurrent имеет значение NULL. Я думаю, что это может быть то место, где я заблудился, потому что будут времена, когда таблица на самом деле равна нулю, и я не хочу также проверять строки, равные 0, в нулевой таблице - person Ron; 05.09.2013
comment
@Ron Оператор && сначала проверяет левую часть и видит, может ли он определить общий результат, основываясь только на левой части. Поскольку AND оценивается как false, когда одна из сторон ложна, && знает ответ на false && anythingElse, не зная, что это за anythingElse. В вашем случае, когда tblCurrent равно null, tblCurrent != null будет оцениваться как false, поэтому && не пойдет дальше и вернет false. Выражение tblCurrent.Rows не будет вычислено. Официальное название этой уловки - короткое замыкание. - person Sergey Kalinichenko; 05.09.2013

Правильный OR operator - ||. | operator - это bitwise OR.

Ваша логика требует AND, а не OR.

if (tblCurrent != null && tblCurrent.Rows.Count != 0)
person Itay    schedule 05.09.2013
comment
На самом деле это не побитовое ИЛИ в контексте, потому что оба операнда являются логическими. Это просто ИЛИ без короткого замыкания. Если бы операнды были числовыми, то это было бы побитовое ИЛИ. - person Servy; 05.09.2013