Background
I am writing a managed x64 assembler (which is also a library), so it has multiple classes which define an unsigned 64-bit integer property for use as addresses and offsets. Some are file offsets, others are absolute addresses (relative to the main memory) and again others are relative virtual addresses.
Problem
I use the ulong
datatype for the properties in the mentioned scenarios, and this works fine. However, such properties are not CLS-compliant. I can mark them as [ClsCompliant(false)]
, but then I need to provide a CLS-compliant alternative to users of the library.
Options and questions
Some suggest providing an alternative property with a bigger data type, but this is not an option because there is no bigger signed integer primitive which could hold all values from 0
to UInt64.MaxValue
.
I would rather not mark my entire assembly as non-CLS-compliant, because in most usage scenario's, not all the possible values up to UInt64.MaxValue
are used. So, for e.g. Address
I could provide an alternative long
property AddressAlternative
, which only accepts positive values. However, what should happen when Address
somehow contains a value above Int64.MaxValue
. Should AddressAlternative
throw some exception?
And what would be an appropriate name for AddressAlternative
?
Providing an alternative for every usage of ulong
would result in many 'double' properties. Is there a better way to do this? Note that not all usages of ulong
properties have the same semantics, so a single struct
would not cut it.
And finally, I have the same CLS compliance problem in constructor parameters. So should I provide an alternative overload accepting long
for such a parameter?
I do not mind restricting the use of (some functionality) of the library when it is used from a CLS-only context, as long as it can be used in most scenarios.