При вызове из C # возвращать запись с нулевым значением - PullRequest
3 голосов
/ 20 февраля 2012

Можно ли когда-нибудь вернуть record option значение из F # в C # как нулевое значение? Я хочу инкапсулировать некоторую логику в сборку F # и скрыть как можно больше за фасадом, «более естественным для C #». Вот несколько синтетических примеров:

type Data = { DataField1: int; DataField2: string }

И код для возврата в C # будет выглядеть так:

type SomeFacade() =
    let data = Some { DataField1 = 1; DataField2 = "hello" }  

    member x.GetData() = if Option.isSome data then Option.get data else null

Но нельзя использовать нулевое значение.

  • Я мог бы попытаться использовать атрибут [<AllowNullLiteral>], но его нельзя использовать для типов записей.
  • Я мог бы использовать Class вместо Record, но было бы сложнее работать с ним внутри F #, поскольку большая часть работы должна выполняться внутри части F #. И мне нравится чрезвычайно удобный способ создания значений записей путем копирования другого значения записи с использованием ключевого слова with.
  • Можно даже использовать Data в качестве записи внутри сборки F # и преобразовать ее в некоторый промежуточный класс DataClass при работе с сборками C #, но это выглядит неловко.

Есть ли решение? (Я не собираюсь использовать нулевые значения внутри кода F #, но я хотел бы вернуть нулевые значения в код C #).

1 Ответ

6 голосов
/ 20 февраля 2012

Для типов записей

Operators.Unchecked.defaultof<Data>

равно null (только что протестировано с использованием fsi)

Это, вероятно, самое простое решение

...