C# 等效于 C++ std::variant(求和类型/可区分联合)

标签 c# variant

在 C++ 中,我们有 std::variant 用于创建 sum-types (又名歧视工会)。
例如,以下将允许 v 保存 std::stringint:

#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::stringint 的值。

我正在寻找 C# 中的类似结构。
看过这篇文章:Variant Type in C# , 但它没有提供我正在寻找的合适的等价物。

C# 有吗?


编辑:
SO 帖子 Discriminated union in C#是相关的,但没有完全回答我的问题,因为我正在寻找一种通用的语言结构,而不是针对特定情况的解决方案。
然而,其中一个答案提到了 OneOf 库,这也是此处接受的答案中的解决方案之一。

最佳答案

您可以使用来自库 language-extEither 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/

相关文章:

c# - 我应该如何使用 P/Invoke 将字符串数组传递给 C 库?

visual-c++ - 如何将 std::variant 作为 VARIANT* 传递给 ExecWB?

C++ 抽象变体实现

c++ - 如何使用 std::variant 保证复制省略?

sql - 按 VARIANT 列加入或分组 : a good practice?

c# - C#中不同的对象列表

c# - 我怎样才能让一个类在表单内创建一个 PictureBox 对象

c# - 使用带有 "new {..}"LINQ 查询的 CopyToDataTable 的异常

c# - 如何以编程方式查找特定服务正在监听的端口

c++ - 更喜欢 std::variant<bool, std::string> 中的 std::string for const char *