Swift: 可选链接和 nil-coalescing 的编译时错误

Swift: compile-time error with optional chaining and nil-coalescing

我在 Swift 中遇到可选链接和 nil-coalescing 的奇怪问题。 谁能解释为什么以下代码无法编译:

class A<T> {
    var val: T
    var x: A<T>?
    var y: A<T>?
    init(t:T){
        val = t
    }
    func test() -> [T] {
        return (self.x?.test() ?? []) + [val] + (self.y?.test() ?? [])
    }
}

但是写的时候

func test() -> [T] {
    return (self.x?.test() ?? []) + ([val] + (self.y?.test() ?? []))
}

是吗? 错误说:

Cannot convert value of type '[T]?' to expected argument type '[_]?'

对我来说,它看起来很像编译器错误。

对于复杂的表达式很难进行类型推断。 [_] 通常意味着类型未知 - 无法推断。简化表达式可在 99% 的时间内解决问题:

class A<T> {
    var val: T
    var x: A<T>?
    var y: A<T>?
    init(t:T){
        val = t
    }
    func test() -> [T] {
        let xResult = self.x?.test() ?? []
        let yResult = self.y?.test() ?? []

        return xResult + [val] + yResult
    }
}

另外 99% 的情况下,类型推断问题可以通过显式指定类型来解决:

return (self.x?.test() as [T]? ?? []) + [val] + (self.y?.test() ?? [])

您自己找到了解决方法。带括号的解决方法删除了一定数量的类型推断路径。

报告为SR-4309