为什么必须调用类成员函数types?

fun test() { class Test(val foo: ((Double, Double) -> Double)?) val test = Test(null) if(test.foo != null) test.foo(1.0, 2.0) } 

上面的代码生成错误:

Kotlin:引用有一个可为空的types’((Double,Double) – > DoubleArray)?’,使用显式的’?.invoke()’来代替函数式的调用。

如果我按照错误的建议,并将调用更改为test.foo?.invoke(1.0, 2.0) ,代码编译,但IntelliJ现在报告

types为’((Double,Double) – > DoubleArray’)的非空接收者进行不必要的安全调用

遵循这个建议,我结束了test.foo.invoke(1.0, 2.0) ,我认为它可以与test.foo(1.0, 2.0) )互换。 为什么这里不是这种情况?

当foo不是class级成员时,事情就像我期望的那样工作:

 fun test2() { val foo: ((Double, Double) -> Double)? = null if(foo != null) foo(1.0, 2.0) } 

这是一个开放的问题: https : //youtrack.jetbrains.com/issue/KT-4113

目前,它的目标版本是1.3。

在这种情况下, 智能铸件似乎不能正常工作,我希望和你一样。 它只适用于invoke()

在这里输入图像说明

我的解决方法是使用let来代替:

 test.foo?.let { foo -> foo(1.0, 2.0) }