namespace MS.Microservice.Core.Functional
{
///
/// 表示"无值"的单例类型,用于构造 的 None 状态。
///
///
///
/// 直接使用 工厂属性即可得到此类型的唯一实例,
/// 再配合 的隐式转换运算符即可将其转换为任意泛型的 None。
///
///
/// 来源:《C# 函数式编程》第 3.2 节 — 使用 Option 表示可选数据。
///
///
public readonly struct NoneType
{
/// 返回字符串 "None"。
public override string ToString() => "None";
}
///
/// 包含非 null 值的 Option 容器,表示 Option 的"有值"状态。
///
/// 被包装的值类型。
///
///
/// 不要直接构造 ,应使用 工厂方法。
/// 不允许包含 null;若需要表示缺失值,请使用 。
///
///
/// 来源:《C# 函数式编程》第 3.2 节 — 使用 Option 表示可选数据。
///
///
public readonly struct Some
{
/// 被包装的非 null 值。
internal T Value { get; }
internal Some(T value)
{
// Some 不允许包含 null;缺失值应通过 None 表示
ArgumentNullException.ThrowIfNull(value, nameof(value));
Value = value;
}
///
public override string ToString() => $"Some({Value})";
public static implicit operator Some(T value) => new(value);
}
///
/// 表示可能存在、也可能不存在的值。
/// 用于函数式编程中替代 null 引用和裸 null 检查,消除 。
///
/// 可选值的类型。
///
///
/// 有两种状态:
///
/// - Some(value):包含一个非 null 的值。
/// - None:表示值不存在。
///
///
///
/// 推荐使用 工厂类创建实例:
///
/// Option<int> some = F.Some(42);
/// Option<int> none = F.None;
///
/// 或利用隐式转换:
///
/// Option<string> opt = "hello"; // Some("hello")
/// Option<string> opt2 = null; // None
///
///
///
/// 使用 进行模式匹配:
///
/// string result = opt.Match(
/// none: () => "no value",
/// some: v => $"value is {v}");
///
///
///
/// 来源:《C# 函数式编程》第 3.2 ~ 3.4 节 — Option、Map、Bind。
///
///
public readonly struct Option : IEquatable