diff --git a/GFramework.Core/extensions/ResultExtensions.cs b/GFramework.Core/extensions/ResultExtensions.cs index dd806ed..0565a96 100644 --- a/GFramework.Core/extensions/ResultExtensions.cs +++ b/GFramework.Core/extensions/ResultExtensions.cs @@ -46,8 +46,11 @@ public static class ResultExtensions if (result.IsFaulted) return Result>.Fail(result.Exception); + if (result.IsBottom) + return Result>.Fail(new InvalidOperationException("Cannot combine Bottom results")); + if (result.IsSuccess) - values.Add(result.Match(succ: v => v, fail: _ => throw new InvalidOperationException())); + result.IfSucc(values.Add); } return Result>.Succeed(values); @@ -101,7 +104,7 @@ public static class ResultExtensions /// var result = Result<int>.Succeed(42); /// var bound = await result.BindAsync(async x => /// await GetUserAsync(x) is User user - /// User>.Succeed(user) + /// ? Result<User>.Succeed(user) /// : Result<User>.Fail(new Exception("User not found"))); /// /// @@ -262,7 +265,7 @@ public static class ResultExtensions string errorMessage = "Value is null") where T : class => value is not null ? Result.Succeed(value) - : Result.Fail(new ArgumentNullException(errorMessage)); + : Result.Fail(new ArgumentNullException(nameof(value), errorMessage)); /// /// 将可空值类型转换为 Result @@ -272,7 +275,7 @@ public static class ResultExtensions string errorMessage = "Value is null") where T : struct => value.HasValue ? Result.Succeed(value.Value) - : Result.Fail(new ArgumentNullException(errorMessage)); + : Result.Fail(new ArgumentNullException(nameof(value), errorMessage)); #endregion } \ No newline at end of file diff --git a/GFramework.Core/functional/Result.T.cs b/GFramework.Core/functional/Result.T.cs index 62bd2ef..a65c505 100644 --- a/GFramework.Core/functional/Result.T.cs +++ b/GFramework.Core/functional/Result.T.cs @@ -101,11 +101,17 @@ public readonly struct Result : IEquatable>, IComparable> public bool IsBottom => _state == ResultState.Bottom; /// - /// 获取内部异常,若为 Bottom 状态则抛出 InvalidOperationException + /// 获取内部异常: + /// - 若为 Failure 状态,则返回内部异常 + /// - 若为 Bottom 状态,则返回带有 "Result is in Bottom state." 消息的 InvalidOperationException + /// - 若为 Success 状态,则返回带有 "Cannot access Exception on a successful Result." 消息的 InvalidOperationException /// [Pure] public Exception Exception => _exception - ?? new InvalidOperationException("Result is in Bottom state."); + ?? (IsBottom + ? new InvalidOperationException("Result is in Bottom state.") + : new InvalidOperationException( + "Cannot access Exception on a successful Result.")); // ------------------------------------------------------------------ 取值 @@ -266,6 +272,7 @@ public readonly struct Result : IEquatable>, IComparable> /// 执行结果 public static Result Try(Func f) { + ArgumentNullException.ThrowIfNull(f); try { return new Result(f());