很难找到解释这个问题的好标题。我将尝试详细解释这个问题。我尝试在另一个if语句中使用带有2个动作的单行if语句。但是,这种用法会失败父if语句的结果。
在进入深层之前,我必须强调下面的方法返回FALSE :
draggedItem.GetComponent<PreparedItem> ().CheckPreparationAvailability ()
上面的方法包含在下面的两个if子句中。因此我希望结果立即 FALSE 。唯一不变的部分是最后一个声明,重点是那里。
没有括号的有问题的版本:
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 ...
}
答案 0 :(得分:6)
考虑一下:
bool a = true;
bool b = false;
Console.WriteLine(a && b && (true) ? true : true); // Prints true
Console.WriteLine(a && b && ((true) ? true : true)); // Prints false
这是因为the precedence of the ?:
operator是这样的,在上面的第一个WriteLine中,就像你写的那样:
(a && b && (true)) ? true : true
始终会产生true
。
第二个,当然是括号,以便它按预期工作。
答案 1 :(得分:1)
如果没有明确的括号,则执行语句的方式与将括号放置如下的方式相同,因为?
的所有内容都被视为内联的条件 - 如果:
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)
所以你的第二个例子是这种情况的有效解决方案。