【发布时间】:2013-10-22 11:46:10
【问题描述】:
我最近一直致力于为 TypeScript 0.9.1 定义生成 FFI 代码。我遇到了这个问题...
这段代码:
type 'T IList with
member __.ConcatWith<'U when 'U :> 'T IList>(items : 'U) : 'T[] = failwith "not implemented"
产生这种类型的错误:
类型参数'T'未定义。
注意:此错误仅发生在类型约束部分内。在其他地方使用泛型类型参数(例如,作为返回类型)可以正常工作。
但是,如果我定义一个类型而不是类型扩展,那就没问题了。不幸的是,我没有这种奢侈。我定义的扩展有时需要在单独的程序集中。
我知道 [<Extension>] 属性,但我希望这些扩展可以从 F# 内部使用(用于 FunScript 项目)。
我可以将方法放在module 中。然而,这些方法将更难被发现。这不是我想要的。
我可以使用 C#。但是,我将无法添加扩展索引和属性。因此,这是不可接受的。
是否有解决此问题的方法?
我在想我可能必须解除类型限制。例如:ConcatWith<'U when 'U :> 'T IList>(items : 'U) 将变为:ConcatWith(items : 'T IList)。
【问题讨论】:
-
我不确定我是否理解这个问题。看起来您错过了括号中的“T”。我的意思是,它应该是 ConcatWith
-
@Gustavo 否,类型参数应该来自类型声明
'T IList或IList<'T>。就像我说的,它在大多数情况下都有效,只是不在类型扩展内的约束部分内。如果它是类型定义而不是类型扩展,它将起作用(即,不是type IList<'T> with,而是type IList<'T>() =)。