添加int和int? 在Kotlin

我遇到了一个问题,看起来很简单,每个人都应该在某个地方碰到这个问题,但却找不到解决办法。

从REPL复制:

var a : Int = 1 var c : Int? = 3 a + if (c != null) {c} else {0} ERROR: None of the following functions can be called with supplied argument (followed by the various implementations of kotlin.int.plus()) 

所以我想要做的是添加一个Int和一个Int? 我想结果是一个Int。 很简单。 我当然知道!! 运算符,但是我希望尽可能避免使用它,因为它不是变更安全的。

 a + if (c != null) {c!!} else {0} 4 

我知道下面的解决方案,它处理null安全性,并避免使用!! 运营商。

 a + (c ?: 0) 4 

我的问题是以下几点:是否有一种方法可以使用if-else块和/或when块来添加,而不需要使用!! 运营商。 我宁愿使用if-else而不使用Elvis操作符的理由是,对于没有Elvis操作符的语言的人来说,它是可理解的。 所以我想尽可能接近a + if (c != null) {c} else {0}

谢谢,如果我的问题或动机不清楚或与Kotlin的设计或意图相反,请告诉我。

†当然,我可能会断言某些变量在添加时是安全的,但是即使代码变化,这个断言也会保留在那里,可能会导致断言失效,从而否定了Kotlin的一个要点:无效的安全性。

问题是kotlin只能假定一个变量在空检查后永远不为空,如果这个变量没有办法改变操作之间的值。

我不完全知道如何执行REPL,但我的猜测是变量作为成员插入上下文类。 这意味着编译器不能假定任何更改都不会发生,因为另一个线程可能会更改操作之间的值。

所以看起来这个功能在REPL中不起作用,但是elvis运算符是一个非常干净的选择。