我在加号运算符中遇到了一些问题所以我决定调查并最终得到以下最小例子。当我编译
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]
则会编译。