FileHelpers BadUsageException только на скомпилированном F #, но не в скрипте - PullRequest
1 голос
/ 27 января 2012

Я написал скрипт 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

Почему он работает как сценарий, но не компилируется?Я хотел бы сохранить его неизменным, если это возможно.Спасибо за понимание!

1 Ответ

1 голос
/ 27 января 2012

FSI использует System.Reflection.Emit для компиляции кода F # на лету.Похоже, что типы, сгенерированные с помощью System.Reflection.Emit, всегда имеют по крайней мере один конструктор (открытый конструктор по умолчанию или явно определенный конструктор).Таким образом, код, испускаемый FSI, не может точно имитировать результат скомпилированного кода, у которого вообще нет конструкторов (ни открытого, ни частного).

...