Не могу привести int к bool - PullRequest
46 голосов
/ 04 июля 2011

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

Мой код

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

Ответы [ 11 ]

55 голосов
/ 04 июля 2011

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

bool result = intValue == 1;

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

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

значение bool имеет значение true или false

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

39 голосов
/ 04 июля 2011

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

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

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

int foo = 10;

if(foo) {
  // Do something
}

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

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

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

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

35 голосов
/ 05 марта 2014
bool b = Convert.ToBoolean(0);

Преобразует 0 и ноль в ложь, а все остальное в истину.

1 голос
/ 18 июля 2014

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

Я должен признать, что думал, что false было нулем, а true было!ложь ....

int fred = 2;

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

непременно напечатает Фред верно

0 голосов
/ 26 мая 2017

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

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

int block = Random.Range(0, 10) + 1;
node.blocked = (block % 2 == 0) ? true : false;
0 голосов
/ 26 октября 2016

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

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

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

0 голосов
/ 06 сентября 2016

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

// bool to int
i = b == true ? 1 : 0;
// int to bool
b = i > 0 ? true : false;
0 голосов
/ 21 марта 2016

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

//in the end of method or something :
return w == 2;
0 голосов
/ 04 июля 2011

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

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

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

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

Вы должны делать что-то общее, чего нет в вашем вопросе.

0 голосов
/ 04 июля 2011

В C # 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.

...