namespace MeloongCore; public readonly struct OneOf { private readonly int _index = -1; // -1 表示未初始化(这是一个 struct,所以这可以让默认值不为 0) private readonly T1? _value1; private readonly T2? _value2; public static implicit operator OneOf(T1 value) => new(1, value, default); public static implicit operator OneOf(T2 value) => new(2, default, value); public static implicit operator T1(OneOf value) => value.As(); public static implicit operator T2(OneOf value) => value.As(); private OneOf(int index, T1? value1, T2? value2) { _index = index; _value1 = value1; _value2 = value2; } /// /// 对不同类型执行不同的操作,并返回同一个值。 /// public TResult Switch(Func f1, Func f2) => _index switch { 1 => f1(_value1!), 2 => f2(_value2!), _ => throw new InvalidOperationException() }; /// /// 对不同类型执行不同的操作。 /// public void Switch(Action f1, Action f2) { if (_index == 1) f1(_value1!); else if (_index == 2) f2(_value2!); else throw new InvalidOperationException(); } /// /// 判断当前的类型是否为 T。 /// public bool Is() => _index switch { 1 when typeof(T) == typeof(T1) => true, 2 when typeof(T) == typeof(T2) => true, _ => false }; public bool IsT1() => _index == 1; public bool IsT2() => _index == 2; /// /// 假定当前的类型为 T,并返回该值。 /// 若当前值的类型不为 T,则抛出 。 /// public T As() => _index switch { 1 when typeof(T) == typeof(T1) => (T)(object)_value1!, 2 when typeof(T) == typeof(T2) => (T)(object)_value2!, _ => throw new InvalidOperationException() }; public T1 AsT1() => _index switch { 1 => _value1!, _ => throw new InvalidOperationException() }; public T2 AsT2() => _index switch { 2 => _value2!, _ => throw new InvalidOperationException() }; } public readonly struct OneOf { private readonly int _index = -1; // -1 表示未初始化(这是一个 struct,所以这可以让默认值不为 0) private readonly T1? _value1; private readonly T2? _value2; private readonly T3? _value3; public static implicit operator OneOf(T1 value) => new(1, value, default, default); public static implicit operator OneOf(T2 value) => new(2, default, value, default); public static implicit operator OneOf(T3 value) => new(3, default, default, value); public static implicit operator T1(OneOf value) => value.As(); public static implicit operator T2(OneOf value) => value.As(); public static implicit operator T3(OneOf value) => value.As(); private OneOf(int index, T1? value1, T2? value2, T3? value3) { _index = index; _value1 = value1; _value2 = value2; _value3 = value3; } /// /// 对不同类型执行不同的操作,并返回同一个值。 /// public TResult Switch(Func f1, Func f2, Func f3) => _index switch { 1 => f1(_value1!), 2 => f2(_value2!), 3 => f3(_value3!), _ => throw new InvalidOperationException() }; /// /// 对不同类型执行不同的操作。 /// public void Switch(Action f1, Action f2, Action f3) { if (_index == 1) f1(_value1!); else if (_index == 2) f2(_value2!); else if (_index == 3) f3(_value3!); else throw new InvalidOperationException(); } /// /// 判断当前的类型是否为 T。 /// public bool Is() => _index switch { 1 when typeof(T) == typeof(T1) => true, 2 when typeof(T) == typeof(T2) => true, 3 when typeof(T) == typeof(T3) => true, _ => false }; public bool IsT1() => _index == 1; public bool IsT2() => _index == 2; public bool IsT3() => _index == 3; /// /// 假定当前的类型为 T,并返回该值。 /// 若当前值的类型不为 T,则抛出 。 /// public T As() => _index switch { 1 when typeof(T) == typeof(T1) => (T) (object) _value1!, 2 when typeof(T) == typeof(T2) => (T) (object) _value2!, 3 when typeof(T) == typeof(T3) => (T) (object) _value3!, _ => throw new InvalidOperationException() }; public T1 AsT1() => _index switch { 1 => _value1!, _ => throw new InvalidOperationException() }; public T2 AsT2() => _index switch { 2 => _value2!, _ => throw new InvalidOperationException() }; public T3 AsT3() => _index switch { 3 => _value3!, _ => throw new InvalidOperationException() }; }