在 C++ 中,我们有 std::variant
用于创建 sum-types (又名歧视工会)。
例如,以下将允许 v
保存 std::string
或 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
此外 - 编译器将强制您只为 v
分配可转换为 std::string
或 int
的值。
我正在寻找 C# 中的类似结构。
看过这篇文章:Variant Type in C# ,
但它没有提供我正在寻找的合适的等价物。
C# 有吗?
编辑:
SO 帖子 Discriminated union in C#是相关的,但没有完全回答我的问题,因为我正在寻找一种通用的语言结构,而不是针对特定情况的解决方案。
然而,其中一个答案提到了 OneOf 库,这也是此处接受的答案中的解决方案之一。
最佳答案
您可以使用来自库 language-ext 的 Either
monad .安装 LanguageExt.Core
NuGet 包。
using LanguageExt;
//...
Either<string, int> v;
v = "aaa";
v = 5;
或者您可以使用 OneOf图书馆。安装 OneOf
NuGet 包。
using OneOf;
//...
OneOf<string, int> v;
v = "aaa";
v = 5;
更新
只是指出:LanguageExt 仅支持 Either
结构中的 2 种类型。但是 OneOf
最多支持 8 种类型。虽然我不知道哪个性能更好、功能更丰富。
关于C# 等效于 C++ std::variant(求和类型/可区分联合),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74520239/