Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C# Equivalent for C++ std::variant (sum type / discriminated-union)

Tags:

c#

variant

In C++ we have std::variant for creating a sum-types (AKA discriminated-union).
For example, the following will allow v to hold either a std::string or an int:

#include <variant>
#include <string>

//...

std::variant< std::string, int> v;
v = "aaa";  // now v holds a std::string
v = 5;      // now v holds an int

In addition - the compiler will enforce that you assign v only with values convertible to std::string or int.

I am looking for a similar construct in C#.
Had a look at this post: Variant Type in C#, but it didn't offer the proper equivalent I am looking for.

Is there one in C#?


Edit:
The SO post Discriminated union in C# is related but does not exactly answer my question because I am looking for a general language construct and not for a solution for a specific case.
However one of the answers mentioned the OneOf library, which is also one of the solutions in the accepted answer here.

like image 393
wohlstad Avatar asked Dec 06 '25 04:12

wohlstad


1 Answers

You can use Either monad from library language-ext. Install LanguageExt.Core NuGet package.

using LanguageExt;

//...

Either<string, int> v;
v = "aaa";
v = 5;

Or you could use OneOf library. Install OneOf NuGet package.

using OneOf;

//...

OneOf<string, int> v;
v = "aaa";
v = 5;

UPDATE

Just to point it out: LanguageExt supports only 2 types in the Either struct. But OneOf supports up to 8 types. Although I am not aware which one is more performant and feature rich.

like image 184
theemee Avatar answered Dec 08 '25 17:12

theemee