具有2个操作的单行if语句的C#编译器错误

时间:2018-04-11 11:35:34

标签: c# if-statement compiler-errors

很难找到解释这个问题的好标题。我将尝试详细解释这个问题。我尝试在另一个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 ...


}

2 个答案:

答案 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)

所以你的第二个例子是这种情况的有效解决方案。