2013-06-27 46 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

相關問題