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