Фон
Я пишу управляемый ассемблер x64 (который также является библиотекой), поэтому у него есть несколько классов, которые определяют 64-разрядное целочисленное свойство без знака для использования в качестве адресов и смещений.Некоторые из них являются смещениями файлов, другие - абсолютными адресами (относительно основной памяти), а другие - относительными виртуальными адресами.
Проблема
Я использую тип данных ulong
для свойств в упомянутомсценарии, и это прекрасно работает.Однако такие свойства не соответствуют CLS.Я могу пометить их как [ClsCompliant(false)]
, но затем мне нужно предоставить CLS-совместимую альтернативу пользователям библиотеки.
Опции и вопросы
Некоторые предлагают предоставлениеальтернативное свойство с большим типом данных, но это не вариант, потому что нет большего целочисленного примитива со знаком, который мог бы содержать все значения от 0
до UInt64.MaxValue
.
Я бы предпочел не отмечать весь мойсборка не совместима с CLS, поскольку в большинстве сценариев использования используются не все возможные значения до UInt64.MaxValue
.Так, например, для Address
я мог бы предоставить альтернативное свойство long
AddressAlternative
, которое принимает только положительные значения.Однако, что должно произойти, если Address
содержит значение выше Int64.MaxValue
.Должно ли AddressAlternative
вызвать какое-то исключение?
И какое имя будет подходящим для AddressAlternative
?
Если предоставить альтернативу для каждого использования ulong
, это приведет ко многим «двойным» свойствам,Есть лучший способ сделать это?Обратите внимание, что не все случаи использования ulong
свойств имеют одинаковую семантику, поэтому один struct
не сможет его обрезать.
И, наконец, у меня одна и та же проблема соответствия CLS в параметрах конструктора.Так должен ли я предоставить альтернативную перегрузку, принимающую long
для такого параметра?
Я не против ограничить использование (некоторых функций) библиотеки, когда она используется из контекста только CLS, есликак это может быть использовано в большинстве сценариев.