首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么不能在类型扩展的约束中使用泛型类型参数?

为什么不能在类型扩展的约束中使用泛型类型参数?
EN

Stack Overflow用户
提问于 2013-10-22 11:46:10
回答 1查看 485关注 0票数 3

最近,我一直致力于为TypeScript 0.9.1定义生成FFI代码。我偶然发现了这个问题..。

此代码:

代码语言:javascript
复制
    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)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-22 15:55:30

在我看来这是个窃听器。

如果实际需要表达的约束是这里的示例('U :> 'T IList)中的约束,那么我认为可以使用#IList<'T>类型(但对于更复杂的约束不起作用)解决这个问题:

代码语言:javascript
复制
type 'T IList with
    member __.ConcatWith(items : #IList<'T>) : 'T[] = failwith "not implemented"

在C# 3.1 (定义和使用)中支持使用Extension的F#样式扩展方法,因此这可能是另一种选择,但这将意味着依赖新版本的F# (但如果有一种使用在F# 3.0中工作的模块函数的替代方法,那么这可能就不那么糟糕了)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19516961

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档