我想使用一個數據結構的記錄,要求其類型具有默認構造函數。不幸的是,這會導致編譯時錯誤。使用需要默認構造函數的泛型
除了改變數據結構(這裏不可能)。或者將記錄更改爲某種類型(需要在其中添加類型註釋)您在這種類型的場景中有哪些選項?
我想有人可以將記錄封裝在一個結構中,但感覺像是黑客。
我想使用一個數據結構的記錄,要求其類型具有默認構造函數。不幸的是,這會導致編譯時錯誤。使用需要默認構造函數的泛型
除了改變數據結構(這裏不可能)。或者將記錄更改爲某種類型(需要在其中添加類型註釋)您在這種類型的場景中有哪些選項?
我想有人可以將記錄封裝在一個結構中,但感覺像是黑客。
嘗試將CLIMutable屬性添加到您的記錄中。
這似乎已經在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)
F#3.1會在VS 2012上運行嗎? – Dave
這正是我想要的...有點。基於此:http://blogs.msdn.com/b/fsharpteam/archive/2012/07/19/more-about-fsharp-3.0-language-features.aspx F#編譯器發出一個默認的構造函數和屬性設置器到生成此類型的IL(儘管這些功能未暴露給F#代碼)。您必須想知道,爲什麼F#代碼不能使用此功能! (這是我需要的)。 – Dave
因此,CLIMutable不滿足一個類型具有默認構造函數的通用約束,但只有當約束位於F#代碼中時,問題是什麼?呸。我可能會向[email protected]發送一個問題,可能現在修改F#3.1並不算太晚,因爲預覽版本剛剛發佈。 –
實際上恰恰相反。該屬性可以在IL中發出默認構造函數,因此使用F#代碼的庫將會看到它。沒有道理的是,如果您嘗試在F#代碼中使用記錄,並說C#庫需要它,那麼在那個時候它不會被識別和出錯! – Dave