Учитывая следующий тип записи F#:
type TestRecord =
{ CustomerId: option<int>
Email: option<string> }
Я могу создавать экземпляры этого типа из С# с помощью
int? customerId = null;
string email = null;
var tr = new TestRecord(customerId, email);
Если я обработаю запись в F#, полученную таким образом из C#, каждое значение NULL C# станет None на стороне F#, а ненулевые значения C# станут Some x на стороне F#.
Это автоматическое преобразование из значений NULL в C# в параметры F# очень удобно для той цели, которую я планирую использовать. Однако мне неясно, является ли это одной из тех вещей, которые работают, но не рекомендуются. Я искал некоторые документы по этому аспекту взаимодействия C# с F#, но могу найти окончательный ответ.
Рекомендуется ли это автоматическое преобразование?
Да, это «автоматическое преобразование», о котором вы говорите в этом выпуске, с тех пор было реализовано, я верю в F# 5. Nullable
в значительной степени совместим с Option
(семантика немного отличается, но на практике это не должно иметь значения).
Согласно Спецификации языка F# 18.4.2 Option.None
представлен как null
, поэтому на него можно положиться.
Нет, Some x
не представлен как x
. Это было бы невозможно. Допустимо иметь Некоторый нуль, где ноль — это некоторый тип ссылки. И наоборот, Nullable null
невозможен (фактически, вы не можете использовать его с типом ref).
Тем не менее, F# преднамеренно реализовал автоматическое преобразование из типов значений, допускающих значение NULL, в типы параметров. Они пересекаются по функциональности (относительно типов значений).
Интересно, сталкивался ли я с этим: github.com/fsharp/fslang-suggestions/issues/774