Предположим, у меня есть метод "m" внутри класса, который имеет несколько необязательных параметров, а именно:
[<AbstractClass;Sealed>]
type API() =
static member m(?x1,?x2,?x3,?x4,?x5,?x6,?x7,?x8,?x9) = //performs operations and returns a string
Аргументы от x1 до x4 могут быть строками или кортежем списка строк * string. Чтобы справиться с этим, я представил несколько вариантов:
1) Конечный пользователь будет иметь доступ к DU
Плюсы: реализация кода будет чрезвычайно простой
Минусы: это пользователь не всегда хорошо переносит строку внутри конструктора DU, например,
2) Определяет x1 - x4 как obj и обрабатывает возможные случаи внутренне, вызывая исключение в случае неправильного типа
Плюсы: реализация кода была бы чрезвычайно простой, пользователю не нужно использовать конструкторы DU
Минусы: небезопасен (может вызывать исключения), пользователь не может извлечь информацию из сигнатуры метода
3) Перегрузка метода
Плюсы: безопасный тип, пользователю не нужно использовать конструкторы DU
Минусы: реализация и использование (см. вопрос ниже )
Учитывая этот сценарий, мои вопросы:
1) Есть ли здесь четвертый вариант, который я не вижу?
2) Относительно метода 3:
а) Когда я пытался использовать I t, пропустив параметр x1 (в конце концов, он должен быть необязательным), появилась ошибка «уникальная перегрузка не может быть определена». Как мне с этим справиться?
б) В этом примере у меня 8 возможностей. Нужно ли повторять почти один и тот же код 8 раз для реализации перегрузки?