C#中如何实现类似JavaScript||运算符的回退值简写逻辑?
在C#中实现类似JavaScript
|| 的回退值逻辑 哈哈,这个问题我当初刚从JavaScript转C#的时候也踩过一模一样的坑!核心原因是C# 的 || 运算符和 JS 的完全不一样——C# 里的 || 只能用于布尔表达式,用来做逻辑或,而不能像 JS 那样对任意类型的值做“取第一个真值”的短路求值,这就是你报错的原因。
不过别担心,C# 有专门的语法可以实现你想要的“当组件获取失败时使用默认值”的需求,而且写法同样简洁:
推荐写法(C# 6+):空条件运算符 + null 合并运算符
Vector2 velocity = GetComponent<Rigidbody2D>()?.velocity ?? Vector2.zero;
解释一下这个组合的作用:
?.是空条件访问运算符:如果GetComponent<Rigidbody2D>()返回的不是null,就正常访问它的velocity属性;如果是null,整个表达式GetComponent<Rigidbody2D>()?.velocity会返回null??是 null 合并运算符:如果左边的表达式结果是null,就取右边的Vector2.zero;否则就用左边的结果
完美实现了你想要的“找不到组件时用默认值”的逻辑,而且写法足够简洁。
兼容旧版C#的写法:三元运算符
如果你还在使用 C# 6 之前的版本(不支持 ?.),可以用三元运算符来实现类似的简写:
var rb = GetComponent<Rigidbody2D>(); Vector2 velocity = rb != null ? rb.velocity : Vector2.zero;
先把组件实例存下来,再通过三元判断决定用组件的速度还是默认值,虽然比上面的写法多一行,但也是很常用的简洁写法。
为什么你的原代码报错?
再啰嗦一句,你写的 GetComponent<Rigidbody2D>().velocity || Vector2.zero 会报错,是因为 C# 要求 || 两边的操作数必须是 bool 类型,而你这里是两个 Vector2 值,编译器不知道怎么对它们做逻辑或运算,所以直接抛出了错误。
内容的提问来源于stack exchange,提问作者Get Off My Lawn
相关产品推荐
相关产品推荐

