ValueVariant 0.5.0
dotnet add package ValueVariant --version 0.5.0
NuGet\Install-Package ValueVariant -Version 0.5.0
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="ValueVariant" Version="0.5.0" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add ValueVariant --version 0.5.0
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
#r "nuget: ValueVariant, 0.5.0"
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install ValueVariant as a Cake Addin #addin nuget:?package=ValueVariant&version=0.5.0 // Install ValueVariant as a Cake Tool #tool nuget:?package=ValueVariant&version=0.5.0
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
ValueVariant
C# source generator to generate efficient and type-safe variant types for unmanaged types.
Usage
using ValueVariant;
[ValueVariant]
public readonly partial struct SampleVariant: IValueVariant<SampleVariant, int, long, float> { }
will generates
readonly partial struct SampleVariant: IEquatable<SampleVariant>
{
[StructLayout(LayoutKind.Explicit)]
private struct Union
{
[FieldOffset(0)] int Item1;
[FieldOffset(0)] long Item2;
[FieldOffset(0)] float Item3;
}
public enum TypeIndex : byte { None, Type1, Type2, Type3 }
private readonly Union Value;
public readonly TypeIndex Index;
public int Item1 => Index == TypeIndex.Type1 ? Value.Item1 : throw new InvalidCastException();
public long Item2 => Index == TypeIndex.Type2 ? Value.Item2 : throw new InvalidCastException();
public float Item3 => Index == TypeIndex.Type3 ? Value.Item3 : throw new InvalidCastException();
public SampleVariant(int value) { ... }
public SampleVariant(long value) { ... }
public SampleVariant(float value) { ... }
public static implicit operator SampleVariant(int value) => new SampleVariant(value);
public static implicit operator SampleVariant(long value) => new SampleVariant(value);
public static implicit operator SampleVariant(float value) => new SampleVariant(value);
public static explicit operator int(SampleVariant value) => value.Item1;
public static explicit operator long(SampleVariant value) => value.Item2;
public static explicit operator float(SampleVariant value) => value.Item3;
public bool Equals(SampleVariant other) { ... }
public override bool Equals(object obj) { ... }
public override int GetHashCode() { ... }
public override string ToString() { ... }
public static bool operator ==(SampleVariant lhs, SampleVariant rhs) { ... }
public static bool operator !=(SampleVariant lhs, SampleVariant rhs) { ... }
...
}
Type conversion between variant types
[ValueVariant]
public readonly partial struct SampleVariant1 : IValueVariant<SampleVariant1, int, Guid, DateTime>
{
public static explicit operator SampleVariant1(SampleVariant2 value)
=> value.Accept(SampleVariant2Converter.Instance);
private sealed class SampleVariant2Converter : DefaultConverter<SampleVariant2Converter>, SampleVariant2.IFuncVisitor<SampleVariant1>
{
public SampleVariant1 Visit(in long value) => throw new InvalidCastException();
public SampleVariant1 Visit(in bool value) => throw new InvalidCastException();
}
}
[ValueVariant]
public readonly partial struct SampleVariant2 : IValueVariant<SampleVariant2, Guid, DateTime, int, long, bool>
{
// implicit because SampleVariant1 ⊂ SampleVariant2
public static implicit operator SampleVariant2(SampleVariant1 value)
=> value.Accept(SampleVariant1Converter.Instance);
private sealed class SampleVariant1Converter : DefaultConverter<SampleVariant1Converter>, SampleVariant1.IFuncVisitor<SampleVariant2> { }
}
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
.NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.0 is compatible. netstandard2.1 is compatible. |
.NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen40 was computed. tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
-
.NETStandard 2.0
- Microsoft.Bcl.HashCode (>= 1.1.1)
-
.NETStandard 2.1
- No dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.