【问题标题】:C# Equivalent for C++ std::variant (sum type)C# 等价于 C++ std::variant(求和类型)
【发布时间】:2022-11-21 22:30:15
【问题描述】:

在 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#里有吗?

【问题讨论】:

  • 那将是object。最终 C# 可能会得到一个 discriminated union
  • 但是 object 可以容纳任何类型,不是吗?如果是这样的话,它不是像std::variant这样的真实总和类型的好替代品。
  • object 是你目前所拥有的(我不认为 dynamic 会做你想做的事)

标签: c# variant


【解决方案1】:

您可以使用 language-ext 库中的 Either monad

或者你可以使用OneOf

using OneOf;

//...

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

【讨论】:

    【解决方案2】:

    你可以使用object

      object v;
      v = "aaa";
      v = 42;
    

    【讨论】:

    • 知道如何强制执行这些值只是strings 或ints(就像编译器将强制执行std::variant)吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    • 1970-01-01
    • 2019-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多