Builds on type of the ConstTypeArgs.Core library to provide const type arguments that allow you to use type parameters to pass ulong values to generics at compile-time. This provides an analog to type specialization in C++, and can be used for scenarios such as: * Static configuration, * Eliminating unnecessary instance constructors, * "Passing" values to type initializers, * And more. Built-in const type arguments cover 0 to 15, powers of 2 up to 65536, and more. Here's a simple demonstration showing how to define and use const type arguments and domain-specific type arguments: using ConstTypeArgs.Ulongs; // Const type arguments: public readonly struct _8 : K_Ulong<_8> { public static ulong Value => 8; } public readonly struct _32 : K_Ulong<_32> { public static ulong Value => 32; } public abstract class DefaultSize : Ulong<_32> { } // Usage: public class Foo<TSize> where TSize : K_Ulong { public static readonly int[] FooArray = new int[TSize.Value]; static Foo() { Console.WriteLine($"Array size is {FooArray.Length}"); } } // Elsewhere var foo = new Foo<_8>(); // Outputs "Array size is 8" foo = new Foo<DefaultSize>(); // Outputs "Array size is 32"
$ dotnet add package ConstTypeArgs.UlongsConst type arguments (also called const type args) are types used to pass constant & static values to generics through type parameters. These values are available at compile-time and can be used in static contexts, such as static constructors, static fields, and static methods. This can provide enhanced type safety, compile-time polymorphism, performance improvements, and more.
You can use types in the ConstTypeArgs.Ulongs namespace for passing ulong values as const type arguments.
Usage scenarios include:
The following is a simple Hello World example to demonstrate how this works:
using ConstTypeArgs.Ulongs;
public class Foo<TSize>
where TSize : K_Ulong
{
public static readonly int[] FooArray = new int[TSize.Value];
static Foo()
{
Console.WriteLine($"Integer array size is {FooArray.Length}");
}
}
// Elsewhere
var foo = new Foo<_3>(); // Outputs "Integer array size is 3"
foo = new Foo<_16>(); // Outputs "Integer array size is 16"
The following shows how a new ulong const type argument could be defined.
public readonly struct _32 : K_Ulong<_32>
{ public static long Value => 32; }
You can also create new domain-specific ulong const type arguments like so:
public sealed class DefaultInitialCollectionSize : Ulong<_32>;