最近,我一直致力于为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)。
发布于 2013-10-22 15:55:30
在我看来这是个窃听器。
如果实际需要表达的约束是这里的示例('U :> 'T IList)中的约束,那么我认为可以使用#IList<'T>类型(但对于更复杂的约束不起作用)解决这个问题:
type 'T IList with
member __.ConcatWith(items : #IList<'T>) : 'T[] = failwith "not implemented"在C# 3.1 (定义和使用)中支持使用Extension的F#样式扩展方法,因此这可能是另一种选择,但这将意味着依赖新版本的F# (但如果有一种使用在F# 3.0中工作的模块函数的替代方法,那么这可能就不那么糟糕了)
https://stackoverflow.com/questions/19516961
复制相似问题