我仍然试图了解C#是如何工作的,现在我不知道如何使用C#Operator || (条件-OR)
void OnTriggerEnter(Collider positionCol) {
if (positionCol.gameObject.tag == "pos_4")
{
Destroy(this.gameObject);
Debug.Log ("i hit and destroyed" + positionCol.tag);
}
else if (positionCol.gameObject.tag == "pos_3" || "pos_2" || "pos_1" )
{
Debug.Log ("i hit " + positionCol.tag);
}
}
它一直告诉我,我不能使用||对于布尔和字符串。我怎样才能以最简单的方式做到这一点?
答案 0 :(得分:4)
你需要扩展这样的条件:
else if (positionCol.gameObject.tag == "pos_3" ||
positionCol.gameObject.tag == "pos_2" ||
positionCol.gameObject.tag == "pos_1")
或者可能使用switch
:
switch (positionCol.gameObject.tag)
{
case "pos_4":
Destroy(this.gameObject);
Debug.Log ("i hit and destroyed" + positionCol.tag);
break;
case "pos_3":
case "pos_2":
case "pos_1":
Debug.Log ("i hit " + positionCol.tag);
break;
default:
break;
}
答案 1 :(得分:1)
是的,positionCol.gameObject.tag == "pos_3"
属于bool
类型,而且
"pos_2"
和"pos_1"
是字符串,因此编译器不允许您使用
申请||在这些操作数上。这个是正常的。
以下内容有效
else if (positionCol.gameObject.tag == "pos_3" || positionCol.gameObject.tag = "pos_2" || positionCol.gameObject.tag = "pos_1" )
所以这就是你解决问题的方法。
答案 2 :(得分:1)
您应该按照其他答案中的说明分开您的陈述。或者,如果您需要检查更多字符串文字,并且需要更少的代码,则可以执行以下操作:
var values = new string[] {"pos_3", "pos_2", "pos_1"};
if(values.Contains(positionCol.gameObject.tag))
{
...
}
答案 3 :(得分:0)
C#||
运算符应该应用于等式表达式。
这就是x == "a" || "b" || "c"
不起作用的原因。
应该是:
x == "a" || x == "b" || x == "c"
由于"a"
只是字符串文字,||
运算符无法应用于此情况。这就像说是“a”是真的吗?。
x == "a"
是一个布尔表达式,因为它可以是eval true
或false
。
例如:
string x = "a";
bool isTrue = x == "a"; // Yes, it's true!
使用现代方法,使用一些LINQ扩展方法有一个更优雅的解决方案:
...
else if (new [] { "pos_3", "pos_2", "pos_1" }.Any(text => positionCol.gameObject.tag == text))
{
Debug.Log ("i hit " + positionCol.tag);
}
Any(...)
将检查某些数组项(或只是IEnumerable<T>
的任何集合或实现)是否返回给定布尔表达式的true
。
Any
的这个用例的其他示例:
// Any will return "true", as at least one number is greater than 0!
new int[] { 3, 44, 1, 5, 188 }.Any(number => number > 0);
详细了解Any
following this link.