[英]F# class constructor with no args — error using filehelpers wtih f#
我使用F#和filehelpers跟蹤了解析CSV的鏈接。 得到以下代碼的編譯器錯誤"The record class oneRow need a constructor with no args (public or private)"
[<DelimitedRecord(",")>]
type oneRow=
class
[<FieldConverter(ConverterKind.Date, "M/d/yyyy")>]
val date: DateTime
val value: bool
end
let engine = new FileHelperEngine(typeof<oneRow>)
let tmp = engine.ReadFile("test.csv")
編輯該解決方案看起來比c#版本相當冗長。 我需要add ()
, mutable
和[<DefaultValue>]
type oneRow() =
class
[<FieldConverter(ConverterKind.Date, "M/d/yyyy")>]
[<DefaultValue>]
val mutable date: DateTime
[<DefaultValue>]
val mutable value: bool
end
但是類似的代碼在C#中工作而沒有指定構造函數。 任何人都可以幫我修復F#代碼嗎? 謝謝。
C#將創建一個構造函數。 F#沒有(大概是因為無參數構造函數意味着可變性,因此並不完全鼓勵。)
例如,在您的代碼中 - 您將如何設置這些屬性,它們仍然是不可變的。
關於冗長的語法 - 它可以更好。 該樣本是在前一段時間(2年)編寫的,所以它仍然使用一些舊的語法。 它可以更新,以允許寫這樣的東西:
[<DelimitedRecord(",")>]
type OneRow
( [<FieldConverter(ConverterKind.Date, "M/d/yyyy")>]
date:DateTime,
value:bool ) =
member x.Date = date
member x.Value = value
我相信這是更好的(通過將注釋移動到構造函數,您還可以在類型中實現自己的功能,例如隱藏一些字段)。 唯一需要做的更改是修改解析器以查找構造函數參數(而不是字段)的屬性。
關於FileHelpers的大多數帖子都過時了。 在某些情況下,雖然使用而不是csv類型提供程序很好。 可以使用F#記錄上的CLIMutable
屬性來創建默認構造函數,在這種情況下,FileHelpers將很樂意編寫和讀取csv文件:
#if INTERACTIVE
#I @"..\packages\FileHelpers\lib\net45"
#r "FileHelpers.dll"
#endif
open FileHelpers
open System
[<DelimitedRecord(",");CLIMutable>]
type TestFileHelp =
{test1:string
test2:string
[<FieldConverter(ConverterKind.Date, "yyyy/MM/dd")>]
date:DateTime
}
let f1 = [|{test1="a";test2="b";date=DateTime.Now};{test1="c";test2="d";date=DateTime.Now}|]
let fengine = new FileHelperEngine<TestFileHelp>()
fengine.WriteFile(@"c:\tmp\testrec.csv",f1)
是的,它應該是type oneRow () =
括號
基於錯誤消息,我認為如果將ctor添加到oneRow中它將起作用。
new () = { date = new DateTime() ; value = false}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.