2013-07-18 6 views
1

Я использую сторонний API, который довольно неуклюже использует параметры ref для создания выходов. Лично я действительно ненавижу этот дизайн API, но это то, что у меня есть для меня прямо сейчас. Мне пришлось скрывать типы данных API немного из-за проприетарного кода, но это не должно иметь отношения к проблеме.F # передача null ссылка на параметр ref

Во всяком случае в C# я могу передать пустую ссылку в качестве параметра реф успешно следующим образом:

  IDataType tl = null; 
      bool success = api.myFunction(ref tl); 

Однако в F # следующий не будет работать

let mutable tl : IDataType = null //null reference assignment in F# 
    let success = api.myFunction(&tl) //& means ref in F# 

возвращает ошибку пустого ссылка исключение , В C# такая ошибка не возвращается.

Неужели кто-нибудь испытывает это раньше? Я думаю, что это должно быть ошибкой в ​​самом API, который является относительно древним дизайном.

** Редактировать: Это должно быть закрыто, я считаю, что ответ не лежит в коде F #, а в API, поскольку это уже ряд известных ошибок, подобных этому.

+0

Вы проверили, не используется ли использование по умолчанию: 'let (success, tl) = api.myFunction()'? –

+0

Извините, я не уверен, что вы имеете в виду, метод myFunction принимает параметр ref как входной сигнал и возвращает логическое значение, а не кортеж. –

+0

Я думаю, что Gene означает, что F # вызывает параметры 'out', но здесь это' ref'. –

ответ

1

Использование ячейки ref также можно здесь. Это работает?

let tl = ref null 
let success = api.myFunction(tl) 
+0

Я думаю, вы имели в виду «let tl = ref» –

+0

Привет, Daniel, как уже упоминалось, я думаю, что мы все пробовали здесь, поэтому единственным оставшимся решением является просмотр кода IL. Я уверен, что нет ничего плохого в коде F #, который любой из нас придумал здесь. –

5

Быстрый и грязный макетирование вашего API в C#

namespace API 
{ 
    public interface IDataType { void Hi(); } 

    public class API: IDataType { 
     public void Hi() { System.Console.WriteLine("Hi!"); } 

     public bool MyFunction(ref IDataType iface) { 
      iface = new API(); 
      return true; 
     } 
    } 
} 

, а затем использовать его из F # точно свой путь, оставаясь в пределах одной и той же CLR:

let mutable iface : API.IDataType = null 
if API.API().MyFunction(&iface) then iface.Hi() 

работает без каких-либо проблем ,

Итак, ваша проблема специфична для вашего данного API и не имеет ничего общего с формой его использования с F #.

+0

Что я сделал, создайте обертку в C# для некоторых вызовов метода для этого API. Не идеально, но означает, что я все еще могу использовать этот API из F #. –

+0

И если вы обертываете оригинальный API, вы можете слегка украсить его, применяя автоматически загруженный шаблон, помещая 'public bool MyFunction (out IDataType iface)' в оболочку C#, а затем используя в качестве F # однострочный 'let (success, iface) = API.API(). MyFunction() ' полностью избавляется от декларации и инициализации ссылки на интерфейс. –

1

Проблема заключалась в том, что API был скомпилирован в .NET 2.0, который отлично работает под C#, но не с F #.

Смежные вопросы