为什么必须使用invoke调用类成员函数类型?

hud*_*onb 6 kotlin

fun test() {
    class Test(val foo: ((Double, Double) -> Double)?)
    val test = Test(null)

    if(test.foo != null) test.foo(1.0, 2.0)
}
Run Code Online (Sandbox Code Playgroud)

上面的代码生成错误:

Kotlin:Reference有一个可空类型'((Double,Double) - > DoubleArray)?',使用显式'?.invoke()'来代替类似函数的调用.

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

对'((Double,Double) - > DoubleArray)类型的非null接收器进行不必要的安全调用

根据这个建议,我最终test.foo.invoke(1.0, 2.0)认为可以互换test.foo(1.0, 2.0); 为什么不是这里的情况?

当foo不是类成员时,事情就像我期望的那样:

fun test2() {
    val foo: ((Double, Double) -> Double)? = null

    if(foo != null) foo(1.0, 2.0)
}
Run Code Online (Sandbox Code Playgroud)

hud*_*onb 4

有一个未解决的问题:https ://youtrack.jetbrains.com/issue/KT-4113

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