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

具有2个操作的单行if语句的C#编译器错误,c#,if-statement,compiler-errors,C#,If Statement,Compiler Errors,很难找到一个好的标题来解释这个问题。我将尽力详细解释这个问题。我尝试使用一个单行if语句,在另一个if语句中包含两个操作。但是,这种用法在父if语句的结果中失败 在深入研究之前,我必须强调,下面的方法返回FALSE: draggedItem.GetComponent<PreparedItem> ().CheckPreparationAvailability () draggedItem.GetComponent().CheckPreparationAvailability()

很难找到一个好的标题来解释这个问题。我将尽力详细解释这个问题。我尝试使用一个单行if语句,在另一个if语句中包含两个操作。但是,这种用法在父if语句的结果中失败

在深入研究之前,我必须强调,下面的方法返回FALSE

draggedItem.GetComponent<PreparedItem> ().CheckPreparationAvailability () 
draggedItem.GetComponent().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 ...


}
if(acceptedTypeID==draggedItem.CurrentTypeID.foodTypePart1
&&draggedItem.GetComponent()!=null
&&draggedItem.GetComponent().CheckPreparationAvailability()//返回FALSE,不要忘记
&&rootTransform.GetComponentsInChildren()。长度考虑以下情况:

bool a = true;
bool b = false;

Console.WriteLine(a && b && (true) ? true : true);   // Prints true
Console.WriteLine(a && b && ((true) ? true : true)); // Prints false
发生这种情况的原因是,在上面的第一行中,就好像你写了:

(a && b && (true)) ? true : true
这总是会导致
为true

当然,第二个是圆括号,以便按照您的预期工作。

考虑一下:

bool a = true;
bool b = false;

Console.WriteLine(a && b && (true) ? true : true);   // Prints true
Console.WriteLine(a && b && ((true) ? true : true)); // Prints false
发生这种情况的原因是,在上面的第一行中,就好像你写了:

(a && b && (true)) ? true : true
这总是会导致
为true


当然,第二个是括号,这样它就可以按照您的预期工作。

如果没有显式括号,语句的执行方式与括号的放置方式相同,因为
的所有内容都被视为内联语句的条件,如果:

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)
if((acceptedTypeID==draggedItem.CurrentTypeID.foodTypePart1
&&draggedItem.GetComponent()!=null
&&draggedItem.GetComponent().CheckPreparationAvailability()//返回FALSE,不要忘记

&&rootTransform.GetComponentsInChildren().Length如果没有显式括号,语句的执行方式与括号的放置方式相同,因为
的所有剩余内容都被视为内联语句的条件,如果:

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)
if((acceptedTypeID==draggedItem.CurrentTypeID.foodTypePart1
&&draggedItem.GetComponent()!=null
&&draggedItem.GetComponent().CheckPreparationAvailability()//返回FALSE,不要忘记

&&rootTransform.GetComponentsInChildren()。长度不关注这一部分。它是用来简化问题的。因为'draggedItem.GetComponent().CheckPreparationAvailability()'返回FALSE,返回true值是没有意义的。PS:这个注释是对某些人的注释的解释--,你甚至想用
&(true)来表达什么?true:true
?不要把重点放在那一部分。它是用来简化问题的。因为'draggedItem.GetComponent().CheckPreparationAvailability()'返回FALSE,所以返回真值是没有意义的。PS:这个注释是对某些人的注释的解释--你甚至想用
&(true)来表达什么?真:真
?通过在一行上看到它们,这看起来更清楚。谢谢。通过在一行上看到它们,这看起来更清楚。谢谢。