没有args的F#类构造函数---使用filehelpers与f#时出错

时间:2011-02-11 15:59:34

标签: c# csv constructor f# filehelpers

我按照parse CSV using F# and filehelpers的链接。编译器出现以下代码错误"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#版本更加冗长。我需要添加()mutable[<DefaultValue>]

  type oneRow() =
      class
        [<FieldConverter(ConverterKind.Date, "M/d/yyyy")>]
        [<DefaultValue>]
        val mutable date: DateTime
        [<DefaultValue>]
        val mutable value: bool
      end

但类似的代码在C#中工作而没有指定构造函数。任何人都可以帮我修复F#代码吗?谢谢。

5 个答案:

答案 0 :(得分:2)

C#将为您创建一个构造函数。 F#没有(大概是因为无参数构造函数意味着可变性,因此并不完全鼓励。)

例如,在您的代码中 - 您将如何设置这些属性,它们仍然是不可变的。

答案 1 :(得分:2)

关于详细的语法 - 它可以更好。该样本是在前一段时间(2年)编写的,所以它仍然使用一些旧的语法。它可以更新,以允许写这样的东西:

[<DelimitedRecord(",")>]
type OneRow
   ( [<FieldConverter(ConverterKind.Date, "M/d/yyyy")>] 
     date:DateTime,
     value:bool ) =
   member x.Date = date
   member x.Value = value

我相信这样做更好(通过将注释移动到构造函数中,您还可以在类型中实现自己的功能,例如隐藏一些字段)。唯一需要做的改变是修改解析器以查找构造函数参数(而不是字段)的属性。

答案 2 :(得分:0)

是的,它应该是type oneRow () =括号

答案 3 :(得分:0)

根据错误消息,我认为如果将ctor添加到oneRow中它会起作用。

new () = { date = new DateTime() ; value = false}

答案 4 :(得分:0)

关于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)