为什么不聪明处理这种情况呢?

我有一些类似于这个结构的代码:

private fun test() : Double { val a : Double? = 15.0 val b : Double? = 20.0 return if (a == null && b == null) { 0 } else if (a != null && b == null) { a } else if (a == null && b != null) { b } else { a+b } } 

根据我的理解,聪明的演员应该推断在最后的“else”声明中,a和b都不能为null,但似乎并不推断这会导致错误。

是否有一个合理的理由,smartcasting不按我期望的方式工作,还是只是不像我想的那样聪明?

它只是不如你想象的那么聪明。

IntelliJ IDEA的问题跟踪系统中存在大量与智能转换有关的问题。 例如https://youtrack.jetbrains.com/issue/KT-6822 ,它是https://youtrack.jetbrains.com/issue/KT-2454的子任务,其中列出了其他可能相关的问题。 我会通过这些,看看你的问题是否已经跟踪,如果没有,创建一个这个,看看是什么来的。