Swift:编译时错误,可选链接和零合并

Swift:编译时错误,可选链接和零合并,swift,optional-chaining,Swift,Optional Chaining,在Swift中,我有一个关于可选链接和零合并的奇怪问题。 有人能解释为什么以下代码无法编译: 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?.t

在Swift中,我有一个关于可选链接和零合并的奇怪问题。 有人能解释为什么以下代码无法编译:

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() ?? [])
    }
}
是吗? 错误显示:

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

对我来说,它看起来很像一个编译器bug。

对于复杂的表达式,类型推断很困难。
[\u]
通常意味着类型未知-无法推断。简化表达式可以在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
    }
}
你自己已经找到了解决办法。使用括号的变通方法会删除一定数量的类型推断路径


报告为

它看起来确实有点像一个bug。也许可以在他们的页面上发布。这确实为问题提供了一个很好的解决方案。也许Swift团队仍然有兴趣看到上面发布的一些有问题的代码,尽管我怀疑它是否会是高优先级的,如果有优先级的话,那么它最终会被解决。@MichaelFoure我想类似的问题已经被报道过很多次了。我记得这里的问题。这个表达式实际上非常简单,所有变量都在范围内定义得很好,应该没有推断问题的余地。可能是运算符的串联是根本原因。@MichaelFourre我检查了报告的类型推断错误,并决定在最后报告它。
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
    }
}
return (self.x?.test() as [T]? ?? []) + [val] + (self.y?.test() ?? [])