//[snippet:Core Definition] #nowarn "42" open System [] type bool<[] 'm> = bool [] type uint64<[] 'm> = uint64 [] type Guid<[] 'm> = Guid [] type string<[] 'm> = string [] type TimeSpan<[] 'm> = TimeSpan [] type DateTime<[] 'm> = DateTime [] type DateTimeOffset<[] 'm> = DateTimeOffset module private Unsafe = let inline cast<'a, 'b> (a : 'a) : 'b = (# "" a : 'b #) type UnitOfMeasure = static member inline tag<[]'m> (x : bool) : bool<'m> = Unsafe.cast x static member inline tag<[]'m> (x : int) : int<'m> = Unsafe.cast x static member inline tag<[]'m> (x : int64) : int64<'m> = Unsafe.cast x static member inline tag<[]'m> (x : uint64) : uint64<'m> = Unsafe.cast x static member inline tag<[]'m> (x : float) : float<'m> = Unsafe.cast x static member inline tag<[]'m> (x : decimal) : decimal<'m> = Unsafe.cast x static member inline tag<[]'m> (x : Guid) : Guid<'m> = Unsafe.cast x static member inline tag<[]'m> (x : string) : string<'m> = Unsafe.cast x static member inline tag<[]'m> (x : TimeSpan) : TimeSpan<'m> = Unsafe.cast x static member inline tag<[]'m> (x : DateTime) : DateTime<'m> = Unsafe.cast x static member inline tag<[]'m> (x : DateTimeOffset) : DateTimeOffset<'m> = Unsafe.cast x static member inline untag<[]'m> (x : bool<'m>) : bool = Unsafe.cast x static member inline untag<[]'m> (x : int<'m>) : int = Unsafe.cast x static member inline untag<[]'m> (x : int64<'m>) : int64 = Unsafe.cast x static member inline untag<[]'m> (x : uint64<'m>) : uint64 = Unsafe.cast x static member inline untag<[]'m> (x : float<'m>) : float = Unsafe.cast x static member inline untag<[]'m> (x : decimal<'m>) : decimal = Unsafe.cast x static member inline untag<[]'m> (x : Guid<'m>) : Guid = Unsafe.cast x static member inline untag<[]'m> (x : string<'m>) : string = Unsafe.cast x static member inline untag<[]'m> (x : TimeSpan<'m>) : TimeSpan = Unsafe.cast x static member inline untag<[]'m> (x : DateTime<'m>) : DateTime = Unsafe.cast x static member inline untag<[]'m> (x : DateTimeOffset<'m>) : DateTimeOffset = Unsafe.cast x static member inline cast<[]'m1, []'m2> (x : bool<'m1>) : bool<'m2> = Unsafe.cast x static member inline cast<[]'m1, []'m2> (x : int<'m1>) : int<'m2> = Unsafe.cast x static member inline cast<[]'m1, []'m2> (x : int64<'m1>) : int64<'m2> = Unsafe.cast x static member inline cast<[]'m1, []'m2> (x : uint64<'m1>) : uint64<'m2> = Unsafe.cast x static member inline cast<[]'m1, []'m2> (x : float<'m1>) : float<'m2> = Unsafe.cast x static member inline cast<[]'m1, []'m2> (x : decimal<'m1>) : decimal<'m2> = Unsafe.cast x static member inline cast<[]'m1, []'m2> (x : Guid<'m1>) : Guid<'m2> = Unsafe.cast x static member inline cast<[]'m1, []'m2> (x : string<'m1>) : string<'m2> = Unsafe.cast x static member inline cast<[]'m1, []'m2> (x : TimeSpan<'m1>) : TimeSpan<'m2> = Unsafe.cast x static member inline cast<[]'m1, []'m2> (x : DateTime<'m1>) : DateTime<'m2> = Unsafe.cast x static member inline cast<[]'m1, []'m2> (x : DateTimeOffset<'m1>) : DateTimeOffset<'m2> = Unsafe.cast x //[/snippet] //[snippet:Examples] [] type m [] type n let x = UnitOfMeasure.tag "string" let y = UnitOfMeasure.cast x let z = UnitOfMeasure.untag y //[/snippet]