Builds on type of the ConstTypeArgs.Core library to provide const type arguments that allow you to use type parameters to pass int 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 -1 to -15, 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.Ints; // Const type arguments: public readonly struct _8 : K_Int<_8> { public static int Value => 8; } public readonly struct _32 : K_Int<_32> { public static int Value => 32; } public abstract class DefaultSize : Int<_32> { } // Usage: public class Foo<TSize> where TSize : K_Int { 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.IntsConst 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.Ints namespace for passing int values as const type arguments.
Usage scenarios include:
The following is a simple example to demonstrate how this works:
using ConstTypeArgs.Ints;
public class Foo<TSize>
where TSize : K_Int
{
public static readonly int[] FooArray = new int[TSize.Value];
static Foo()
{
Console.WriteLine($"Array size is {FooArray.Length}");
}
}
// Elsewhere
var foo = new Foo<_3>(); // Outputs "Array size is 3"
foo = new Foo<_16>(); // Outputs "Array size is 16"
The following shows how a new int const type argument could be defined.
public readonly struct _77 : K_Int<_77>
{ public static int Value => 77; }
You can also create new domain-specific int const type arguments like so:
public sealed class DefaultInitialCollectionSize : Int<_32>;