У меня есть некоторые типы, которые применяют числовые диапазоны значений, и я использую их во многих файлах в одном проекте.Они выглядят примерно так:
[<Struct>]
type NonNegativeMoney =
new(x) =
if x < 0m then invalidArg "x" "Ruh-roh..."
{ Value = x }
val Value : decimal
static member (+) (x: NonNegativeMoney, y: NonNegativeMoney) = NonNegativeMoney(x.Value + y.Value)
Теперь я хочу сделать эти типы внутренними в сборке и оставить открытой только мою модель типов OO.Однако, когда я переворачиваю эти типы во внутренний, я получаю следующую ошибку компилятора:
Элемент или конструктор объекта 'op_Addition' не является открытым.Доступ к закрытым членам возможен только из объявленного типа.Доступ к защищенным элементам возможен только из расширяющего типа, а доступ из внутренних лямбда-выражений невозможен.
Причина этого была рассмотрена в вопросе Почему с этим не работает компилятор F #инфиксный оператор? .Решение, предложенное в ответе, заключается в использовании файлов подписи F # , чтобы сделать типы внутренними.Это работает для сценария OP в этом вопросе, где использование оператора ограничено типом в том же файле.Тем не менее, я не могу найти способ заставить его работать, чтобы оператор был доступен из всех файлов в моем проекте.Если я использую файл подписи, он работает внутри файла, но не внутри файла.
Есть ли способ заставить эту работу работать так, чтобы типы были внутренними для сборки, но были видны во всех файлах в моем проекте?Я хотел бы сохранить операторы, так как я использую библиотечные функции, такие как Seq.sum
, которые требуют их для суммируемых типов.