Я написал скрипт fsi, который отлично работал и хотел скомпилировать его, чтобы мне было легче его перемещать.Однако, когда я скомпилировал его, внезапно FileHelpers начал выдавать ошибки.
В следующем коде используется FileHelpers 2.9.9 .Это минимальный рабочий пример, иллюстрирующий проблему: test.fsx
:
#r "FileHelpers.dll"
open FileHelpers
[<DelimitedRecord(",")>]
type Type =
val field1 : string
val field2 : int
override x.ToString() = sprintf "%s: %d" x.field1 x.field2
let readFile<'a> file = seq {
use engine1 = new FileHelperAsyncEngine(typeof<'a>)
use tmp1 = engine1.BeginReadFile(file)
engine1.ReadNext() |> ignore
while engine1.LastRecord <> null do
yield engine1.LastRecord :?> 'a
engine1.ReadNext() |> ignore
}
readFile<Type> "test.csv" |> Seq.iter (printfn "%A")
с файлом test.csv
как
test1,1
test2,2
test3,3
Если я запускаю код как fsi .\test.fsx
будет работать нормальноОднако, если я попытаюсь скомпилировать его с помощью fsc .\test.fsx
и запустить .\test.exe
, я получу ошибку Unhandled Exception: FileHelpers.BadUsageException: The record class Type needs a constructor with no args (public or private)
.Обходной путь, который работает как в сценариях, так и в режиме компиляции,
[<DelimitedRecord(",")>]
type Type () =
[<DefaultValue>]
val mutable field1 : string
[<DefaultValue>]
val mutable field2 : int
override x.ToString() = sprintf "%s: %d" x.field1 x.field2
Почему он работает как сценарий, но не компилируется?Я хотел бы сохранить его неизменным, если это возможно.Спасибо за понимание!