foo.go:4:9: invalid operation: a < b (operator < does not apply to comparable type T)
为了使错误信息有帮助,它必须引用 cmp.Ordered 。例如:
foo.go:4:9: invalid operation: a < b (type parameter T must satisfy cmp.Ordered interface to be used with <)
foo.go:4:9: invalid operation: a < b (type parameter T must be cmp.Ordered with <)
foo.go:4:9: invalid operation: a < b (type parameter T is missing cmp.Ordered required for <)
foo.go:4:9: invalid operation: a < b (operator < with type parameter T must satisfy cmp.Ordered)
foo.go:4:9: invalid operation: a < b (operator < with type T must be cmp.Ordered)
switch op {
case syntax.Eql, syntax.Neq:
cause = check.sprintf("type parameter %s is not comparable with %s", errOp.typ, op)
case syntax.Lss, syntax.Leq, syntax.Gtr, syntax.Geq:
cause = check.sprintf("type parameter %s can not be ordered with %s", errOp.typ, op)
}
5条答案
按热度按时间cqoc49vn1#
我认为我们应该提到无效的操作符。例如:
f5emj3cl2#
看起来错误是在src/cmd/compile/internal/types2/expr.go和src/go/types/expr.go中定义的。从快速查看来看,"不可比较"似乎是Go错误的常见短语,尽管我完全同意错误信息可能会有点令人困惑。
kq0g1dla3#
我认为我们应该提到无效的操作符。例如:
为了使错误信息有帮助,它必须引用
cmp.Ordered
。例如:raogr8fs4#
为了使错误信息有帮助,它必须引用cmp.Ordered。这里可以是任何类型的操作符,所以不确定是否可行(或值得)报告它。
2ekbmq325#
根据规范中提到的可比与有序的区别,用户需要了解的关键区别是:
因此,根据操作符对错误消息中的
comparable
位进行参数化(在第580行)可能就足够了:其中,当
op
是syntax.Eql, syntax.Neq:
时,verb
可以是 "comparable" ,而如果op
是syntax.Lss, syntax.Leq, syntax.Gtr, syntax.Geq
,则可以是 "orderable" 。术语 "orderable" 在这个句子结构中是可以接受的,但缺点是它不够正式(甚至可能不是语法上的英语,不确定)。规范中使用的术语是 "ordered"。因此,另一种选择是允许错误消息有所不同。例如,这样的逻辑: