Нельзя использовать int для bool

Я столкнулся с проблемой, что С# в моем случае не может использовать число 1 для bool. В моем сценарии (bool)intValue не работает. Я получаю InvalidCastException. Я знаю, что могу использовать Convert.ToBoolean(...), но мне просто интересно, что это не работает. Любое объяснение этому?

Мой код

if (actualValueType.Name == "Boolean" || setValueType.Name == "Boolean")
{
   if ((bool)actualValue != (bool)setValue)
   ...
}

Ответ 1

int и bool нельзя преобразовать неявно (в отличие от С++, например).

Это было убедительное решение, сделанное разработчиками языка, чтобы сохранить код из ошибок, когда число было использовано в состоянии. Условия должны принимать значение boolean явно.

Невозможно написать:

int foo = 10;

if(foo) {
  // Do something
}

Представьте, что разработчик хотел сравнить foo с 20, но пропустил один знак равенства:

if(foo = 20) {
  // Do something
}

Вышеприведенный код будет компилироваться и работать - и побочные эффекты могут быть не очень очевидными.

Аналогичные улучшения были сделаны с switch: вы не можете упасть с одного случая на другой - вам нужно явно break или return.

Ответ 2

Нет необходимости делать:

bool result = intValue == 1;

Из документов:

Включение bool упрощает запись самодокументирующего кода

Значение bool равно true или false

1.2.1 Предопределенные типы (С#)

Ответ 3

bool b = Convert.ToBoolean(0);

Преобразует 0 и значение null в значение false и что-то еще в true.

Ответ 4

В других языках значение false равно 0, а true эквивалентно 1, но это невозможно на языке С#.

Ответ 5

В С# bool на самом деле Boolean struct, поэтому он не только представлен как 1 или 0 внутри. Похоже, что создатели языка пошли на явный неявный подход в целом с языком. Чтобы выполнить то, что вы пытаетесь сделать (эффективно отбрасывать 1 до true и от 0 до false), выполните следующее:

if (intValue == 1) {
    // do something
} else if (intValue == 0) {
    // do something else
} else {
    // invalid bool
}

Вы также можете отбросить последнее предложение else и сделать типичную вещь на языке C и позволить intValue == 0 быть эквивалентным false, а что-нибудь еще true.

Ответ 6

Возможно, здесь повторяются другие, но вы не можете использовать int для bool, потому что int не является bool. Это int. Кто бы мог подумать?;-)

Вам нужно создать новый bool на основе вашего значения int, а уже опубликованный "myvar!= 0" кажется достаточно хорошим.

И где вы получаете свое исключение? Выполнение следующего кода, скорее всего, приведет к ошибке компилятора:

int myIntValue = 0;
bool myBoolValue = (bool)myIntValue;

Вы должны делать некоторые общие вещи, которые не отображаются в вашем вопросе.

Ответ 7

"В других языках значение false равно 0, а true эквивалентно 1, но это невозможно в языке С#.

Я должен признать, что я думал, что значение false равно нулю, а true - false...

int fred = 2;

if (fred == true)
{
    printf("fred is true");
}

обязательно напечатает fred is true

Ответ 8

если вы хотите вставить две переменные значений в bool, например, var (1 и 2 и хотите вернуть 1 для false и 2 для true), я предлагаю:

//in the end of method or something :
return w == 2;

Ответ 9

Вы можете использовать тернарный оператор, как показано ниже, вместо броска.   bool b = true;   int я = 1;

// bool to int
i = b == true ? 1 : 0;
// int to bool
b = i > 0 ? true : false;

Ответ 10

Если все, что вам нужно, не нужно вводить != 0 в if (foo != 0), вы можете сделать метод расширения для типа int и сделать что-то вроде if (foo.IsNonZero()).

Если С# разрешено для свойств расширения, вы можете написать if (foo.IsNonZero) без круглых скобок, что, на мой взгляд, будет более ясно, чем оригинальное if (foo != 0), но, к сожалению, в настоящее время это не так.

Вы, вероятно, лучше с ранее предложенным Convert.ToBoolean(foo) в любом случае.

Ответ 11

Я работаю над поиском путей для обучения. Мне нужно случайным образом заблокировать некоторые узлы как доступные/заблокированные.

Вот простое решение, которое я придумал:

int block = Random.Range(0, 10) + 1;
node.blocked = (block % 2 == 0) ? true : false;