如果使用可空布尔值和 elvis 运算符检查检查检查失败,为什么?

If check with nullable boolean and elvis operator fails inspection check, why?

在Android Studio中我在一个函数中写了以下内容:

if (startTimes.value?.containsKey(name)?:false) {
    return startTimes?.value?.get(name)
}

Android Studio 突出显示 if 的内容,并带有消息 Equality check should be used instead of elvis for nullable boolean check 的警告,并建议我将其替换为:

if (startTimes.value?.containsKey(name) == true) {
    return startTimes?.value?.get(name)
}

为什么 IDE 更喜欢第二个?据我所知,它们在逻辑上是相同的。

第一步是两步。它执行空检查,然后求值。第二个直接计算值。

就个人而言,我认为第二种更容易推理。

“是 x,否则如果 x 为空则为假,为真?”

对比

“x 完全正确吗?”

除此之外,还有一些编译器试图强加给你的习语,我认为是为了让代码总体上更具可读性。如果大多数人使用相同的习语,就更容易阅读彼此的代码。

根据 truefalse 检查可空布尔值是 "official" Kotlin idiom:

Nullable Boolean

val b: Boolean? = ... 
if (b == true) {
    ... 
} else {
    // `b` is false or null 
}

这里是the relevant discussion关于成语的内容,包括支持和反对的意见。