Swift编译器无法为泛型函数中的数组解析+运算符的正确重载

时间:2017-03-20 13:48:03

标签: swift generics operator-overloading

我在加号运算符中遇到了一些问题所以我决定调查并最终得到以下最小例子。当我编译

func f<T>(t: T) -> [T]
{
    return [t] + [t]
}
一切都很好。编译器选择plus运算符的这个重载:

public func +<RRC1 : RangeReplaceableCollection, RRC2 : RangeReplaceableCollection
    where RRC1.Iterator.Element == RRC2.Iterator.Element>
    (lhs: RRC1, rhs: RRC2) -> RRC1

然而,当我在游戏中添加另一个+时,我明白了:

func f<T>(t: T) -> [T]
{
    return [t] + [t] + [t]
}

main.swift:30:9: error: cannot convert value of type '[T]' to expected argument type '[_]' (aka 'Array<_>')
    return [t] + [t] + [t]
           ^~~
               as! [_]

我找到了几种方法来完成这项工作,比如return ([t] as [T]) + [t] + [t],或者这个:

func f<T>(t: T) -> [T]
{
    let t1 = [t]
    return t1 + [t] + [t]
}

(这可能基本上是一样的)但我想知道实际问题是什么。这是编译器中的错误吗? 或者我在这里不理解什么?试图告诉我的错误消息中的[_]是什么?

我也查看了AST,但是,只有浅见的编译器101知识,这似乎证实了我的预感,编译器无法 找到正确的加号运算符版本。

我正在使用包含

的Xcode 8.2.1(8C1002)
$ swift --version
Apple Swift version 3.0.2 (swiftlang-800.0.63 clang-800.0.42.1)
Target: x86_64-apple-macosx10.9

更新

我忘了在语句中添加括号(([t] + [t]) + [t][t] + ([t] + [t]))也不会编译,而return (+)([t], [t]) + [t]则会编译。

1 个答案:

答案 0 :(得分:0)

所以我做了Hamish建议并提交SR-4304的内容。根据乔丹罗斯的说法,这仍然是主人。当有任何有关该bug的消息时,我会更新这个答案。