2013-06-27 50 views
1

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

除了改变数据结构(这里不可能)。或者将记录更改为某种类型(需要在其中添加类型注释)您在这种类型的场景中有哪些选项?

我想有人可以将记录封装在一个结构中,但感觉像是黑客。

回答

4

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

+0

这正是我想要的...有点。基于此:http://blogs.msdn.com/b/fsharpteam/archive/2012/07/19/more-about-fsharp-3.0-language-features.aspx F#编译器发出一个默认的构造函数和属性设置器到生成此类型的IL(尽管这些功能未暴露给F#代码)。您必须想知道,为什么F#代码不能使用此功能! (这是我需要的)。 – Dave

+0

因此,CLIMutable不满足一个类型具有默认构造函数的通用约束,但只有当约束位于F#代码中时,问题是什么?呸。我可能会向[email protected]发送一个问题,可能现在修改F#3.1并不算太晚,因为预览版本刚刚发布。 –

+0

实际上恰恰相反。该属性可以在IL中发出默认构造函数,因此使用F#代码的库将会看到它。没有道理的是,如果您尝试在F#代码中使用记录,并说C#库需要它,那么在那个时候它不会被识别和出错! – Dave

7

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

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

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

let r = f<R>() 

在F#3.0(VS 2012),你会得到一个错误的最后一行 - error FS0001: A generic construct requires that the type 'R' have a public default constructor

但它在F#3.1工程(尚未RTM,但public pre-release was earlier this week

+0

F#3.1会在VS 2012上运行吗? – Dave

相关问题