可空类型对象判空异常:返回False却进入null分支
问题原因分析与解决办法
核心问题:运算符优先级导致的Debug输出错误
你写的Debug.Log("check" + unit==null)存在运算符优先级问题:C#中字符串拼接+的优先级高于相等比较==,所以这个表达式会先执行"check" + unit,把unit转换成字符串后拼接成新字符串,再将这个字符串和null比较。
- 哪怕
unit确实是null,拼接后会得到"checknull"这个非空字符串,和null比较的结果必然是False,所以这个输出完全无法反映unit的真实状态。
正确的Debug写法
要准确输出unit是否为null,必须给比较表达式加括号,强制先执行null判断:
Debug.Log("check " + (unit == null));
为什么if (unit==null)会进入分支
if (unit==null) continue;是直接对unit和null做比较,没有优先级干扰,所以这个判断是准确的。这说明你的unit??=new Unit(pars)并没有成功给unit赋值,可能的原因包括:
- 构造函数
new Unit(pars)执行时抛出了异常,导致赋值失败 - 这段赋值代码所在的分支没有被执行到,
unit始终保持null状态
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

