Ошибка компилятора c# для одной строки оператора if с двумя действиями

Было трудно найти хорошее название, объясняющее проблему. Постараюсь подробно объяснить проблему. Я пытаюсь использовать однострочный оператор if с двумя действиями внутри другого оператора if. Однако это использование не дает результата родительского оператора if.

Прежде чем углубиться в подробности, я должен подчеркнуть, что метод ниже возвращает FALSE:

draggedItem.GetComponent<PreparedItem> ().CheckPreparationAvailability () 

Вышеупомянутый метод включен в два нижеприведенных оператора if. Поэтому ожидаю результата ЛОЖНЫЙ сразу. Единственная изменяющаяся часть - это последнее утверждение, сосредоточьтесь на нем.

Проблемная версия без скобок:

if (acceptedTypeID == draggedItem.CurrentTypeID.foodTypePart1
        && draggedItem.GetComponent<PreparedItem> () != null 
        && draggedItem.GetComponent<PreparedItem> ().CheckPreparationAvailability () // RETURNS FALSE, DO NOT FORGET
        && rootTransform.GetComponentsInChildren<DragAndDropItem> ().Length <= 0
        && draggedItem.RootTransform.GetComponentInChildren<PlateCell>()
        && (true)? true : true) { // problem here 

        'if' is considered as TRUE and the inside is executed ...


}

Рабочая версия в круглых скобках:

if (acceptedTypeID == draggedItem.CurrentTypeID.foodTypePart1
        && draggedItem.GetComponent<PreparedItem> () != null 
        && draggedItem.GetComponent<PreparedItem> ().CheckPreparationAvailability () // RETURNS FALSE, DO NOT FORGET
        && rootTransform.GetComponentsInChildren<DragAndDropItem> ().Length <= 0
        && draggedItem.RootTransform.GetComponentInChildren<PlateCell>()
        && ((true)? true : true)) { // WORKS AS EXPECTED 

        'if' is considered as FALSE which is expected and the inside is NOT executed ...


}

Не сосредотачивайтесь на этой части. Это нужно для того, чтобы упростить проблему. Поскольку 'draggedItem.GetComponent <PreparedItem> () .CheckPreparationAvailability ()' возвращает FALSE, повторение истинных значений бессмысленно. PS: этот комментарий был объяснением чьего-то комментария -_-

Eray Tuncer 11.04.2018 13:39

Что вы вообще хотите выразить с помощью && (true)? true : true?

HimBromBeere 11.04.2018 13:40
1
2
84
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Учти это:

bool a = true;
bool b = false;

Console.WriteLine(a && b && (true) ? true : true);   // Prints true
Console.WriteLine(a && b && ((true) ? true : true)); // Prints false

Это происходит потому, что приоритет оператора ?: таково, что в первой строке WriteLine выше, как если бы вы написали это:

(a && b && (true)) ? true : true

что всегда будет приводить к true.

Второй, конечно, заключен в скобки, чтобы он работал так, как вы ожидали.

Если увидеть их в одной строке, это станет более очевидным. Спасибо.

Eray Tuncer 11.04.2018 13:45

Без явных круглых скобок оператор выполняется так же, как если бы круглые скобки были размещены следующим образом, поскольку все, что осталось от ?, считается условием для встроенного if:

if ((acceptedTypeID == draggedItem.CurrentTypeID.foodTypePart1
        && draggedItem.GetComponent<PreparedItem> () != null 
        && draggedItem.GetComponent<PreparedItem> ().CheckPreparationAvailability () // RETURNS FALSE, DO NOT FORGET
        && rootTransform.GetComponentsInChildren<DragAndDropItem> ().Length <= 0
        && draggedItem.RootTransform.GetComponentInChildren<PlateCell>()
        && (true)) ? true : true)

Итак, ваш второй пример - подходящее решение для такого случая.

Другие вопросы по теме