вызов функций F # из C # и получение исключений нулевой ссылки

2

Я использую Visual Studio 2008 с установленным в октябре 2009 FTP CTP.

Я пытаюсь вызвать некоторый код F # из моей программы на С#. Большинство типов функций F #, похоже, работают, но некоторые из них не инициализируются в F # и бросают NullReferenceExceptions. Те, кто делает это, - это закрытие и частично применяемые функции, то есть вещи, которые появляются на С# в виде типов FastFunc < > .

Есть ли что-то, что я делаю неправильно или забываю, или это, возможно, ошибка с F # или .NET?

приведенный ниже код предназначен для демонстрации проблемы. Я действительно не пытаюсь использовать этот код в реальном приложении. также, в пределах F #, все работает правильно. это проблема F # -to-С#

F #:

namespace FS      
module FunctionTypes =

    //these all work in c# as expected
    let Value = "value"

    let OneParam (str:string) = str

    let TwoParam (str:string) (str2:string) = str + " " + str2

    let Lambda =
        fun () -> "lambda"  


    //these functions are null references in C#
    // they do work as expected in F# interactive mode
    let PartialApplication = TwoParam "what up"

    let Closure = 
        let o = new System.Object()
        fun (i:int) -> o.ToString() + i.ToString()

    let ClosureWrapper (i:int) =
        Closure i  

С# (ссылки F # project и FSharp.Core)

 //these work as expected:
        var oneParam = FS.FunctionTypes.OneParam("hey");
        var twoParam = FS.FunctionTypes.TwoParam("yeah", "you");
        var lambdaFunction = FS.FunctionTypes.Lambda();
        var value = FS.FunctionTypes.Value;
        //  in the May09 CTP, Value returned null, 
        //      so it must have been fixed in Oct09 CTP



 //these do not work--each throws a NullReferenceException.
        var partial = FS.FunctionTypes.PartialApplication.Invoke("hello");
        var closure = FS.FunctionTypes.Closure.Invoke(1);
        var closureWrapper = FS.FunctionTypes.ClosureWrapper(1);

 //  FS.FunctionTypes.Closure itself is null, 
 //  so is FS.FunctionTypes.PartialAppliction.
 //  FS.FunctionTypes.ClosureWrapper is a regular function, 
 //    but it calls Closure, which is null     
  • 0
    Код F # скомпилирован в .exe или .dll?
  • 0
    @Brian Это скомпилировано в .dll. Установка представляет собой два проекта в одном решении, причем проект C # ссылается на проект F #.
Показать ещё 5 комментариев
Теги:
closures
f#

1 ответ

2
Лучший ответ

Он работает для меня, я получаю "что привет Hello", "System.Object1", "System.Object1" для частичного закрытия и закрытия Wrapper vars. Вы ссылаетесь на хорошую сборку FSharp.Core?

  • 0
    @ Стрингер Белл, да, я ссылался на FSharp.Core. Проблема была в том, что мой проект FSharp компилировался в исполняемый файл ... Теперь у меня все работает.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню