簡體   English   中英

沒有args的F#類構造函數 - 使用filehelpers與f#時出錯

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM