Нельзя использовать 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;