F# 使用需要默认构造函数的泛型记录

F# 使用需要默认构造函数的泛型记录,f#,F#,我希望使用数据结构要求其类型具有默认构造函数的记录。不幸的是,这会导致编译时错误 除了更改数据结构(此处不可能)。或者将记录更改为一种类型(需要在任何地方添加类型注释),在这种类型的场景中有哪些选项 我想可以将记录包装到结构中,但这感觉像是黑客攻击。尝试将属性添加到记录中。这似乎在F#3.1中已经修复。考虑这个代码: [<CLIMutable>] type R = {a : int} let f<'a when 'a : (new : unit -> 'a)>()

我希望使用数据结构要求其类型具有默认构造函数的记录。不幸的是,这会导致编译时错误

除了更改数据结构(此处不可能)。或者将记录更改为一种类型(需要在任何地方添加类型注释),在这种类型的场景中有哪些选项


我想可以将记录包装到结构中,但这感觉像是黑客攻击。

尝试将属性添加到记录中。

这似乎在F#3.1中已经修复。考虑这个代码:

[<CLIMutable>]
type R = {a : int}

let f<'a when 'a : (new : unit -> 'a)>() = new 'a()

let r = f<R>()
[]
类型R={a:int}
设f'a)>()=新的'a()
设r=f()
在F#3.0(VS 2012)中,最后一行出现错误-
错误FS0001:泛型构造要求类型“R”具有公共默认构造函数


但是它在F#3.1中工作(还不是RTM,但是)

这正是我想要的……有点。基于此:F#编译器将默认构造函数和属性设置器发送到为该类型生成的IL中(尽管这些特性不向F#代码公开)。你一定会想,为什么F#code不能使用这个特性呢!(这就是我所需要的)。所以CLIMutable不满足类型具有默认构造函数的泛型约束,但只有当约束在F#code中时,这就是问题所在吗?讨厌。我可能会问你一个问题fsbugs@microsoft.com关于这一点,也许现在在F#3.1中修复还不算太晚,因为预览版才刚刚发布。事实恰恰相反。该属性可以在IL中发出默认构造函数,因此使用F#代码的库将看到它。没有意义的是,如果你试图将F代码中的记录与需要它的C库一起使用,那么在那个时候它就不会被识别,并且会出错!F#3.1会在VS 2012上运行吗?