diff --git a/src/OneBitSoftware.Utilities.OperationResult/OneBitSoftware.Utilities.OperationResult.csproj b/src/OneBitSoftware.Utilities.OperationResult/OneBitSoftware.Utilities.OperationResult.csproj
index 6881c37..d3b9270 100644
--- a/src/OneBitSoftware.Utilities.OperationResult/OneBitSoftware.Utilities.OperationResult.csproj
+++ b/src/OneBitSoftware.Utilities.OperationResult/OneBitSoftware.Utilities.OperationResult.csproj
@@ -32,7 +32,7 @@
False
README.md
OneBitSoftware; OperationResult;
- 2.0.0
+ 2.1.0
diff --git a/src/OneBitSoftware.Utilities.OperationResult/OperationResult.cs b/src/OneBitSoftware.Utilities.OperationResult/OperationResult.cs
index bc060b8..5682a1a 100644
--- a/src/OneBitSoftware.Utilities.OperationResult/OperationResult.cs
+++ b/src/OneBitSoftware.Utilities.OperationResult/OperationResult.cs
@@ -295,6 +295,17 @@ public OperationResult(TResult resultObject) : base()
///
public TResult? ResultObject { get; set; }
+ ///
+ /// Appends error from to the current instance.
+ ///
+ /// The to append from.
+ /// The original with the appended messages from .
+ public new OperationResult AppendErrors(OperationResult? otherOperationResult)
+ {
+ base.AppendErrors(otherOperationResult);
+ return this;
+ }
+
///
/// This method will append an error with a specific `user-friendly` message to this operation result instance.
///
diff --git a/tests/OneBitSoftware.Utilities.OperationResultTests/OperationResultAppendErrorsTests.cs b/tests/OneBitSoftware.Utilities.OperationResultTests/OperationResultAppendErrorsTests.cs
index b18b318..282ef61 100644
--- a/tests/OneBitSoftware.Utilities.OperationResultTests/OperationResultAppendErrorsTests.cs
+++ b/tests/OneBitSoftware.Utilities.OperationResultTests/OperationResultAppendErrorsTests.cs
@@ -177,4 +177,318 @@ public void AppendErrors_ShouldLogWhenCreatedWithNoLogger()
// Assert
Assert.Equal(1, testLogger.LogMessages.Count);
}
+
+ [Fact]
+ public void AppendErrors_NonGenericSource_To_GenericTarget_Retains_Generic_Type_And_MergesErrors()
+ {
+ // Arrange
+ var source = new OperationResult();
+ source.AppendError("E1", 101, LogLevel.Warning, "D1");
+
+ var target = new OperationResult();
+ target.AppendError("E0", 100, LogLevel.Information, "D0");
+
+ // Act
+ var returned = target.AppendErrors(source);
+
+ // Assert
+ Assert.Same(target, returned);
+ Assert.True(target.Fail);
+ Assert.Equal(2, target.Errors.Count);
+ Assert.NotNull(target.Errors.Single(e => e is { Code: 100, Message: "E0" }));
+ Assert.NotNull(target.Errors.Single(e => e is { Code: 101, Message: "E1" }));
+ }
+
+ [Fact]
+ public void AppendErrors_GenericSource_To_GenericTarget_Retains_Generic_Type_And_MergesErrors()
+ {
+ // Arrange
+ var source = new OperationResult();
+ source.AppendError("E1", 101, LogLevel.Warning, "D1");
+
+ var target = new OperationResult();
+ target.AppendError("E0", 100, LogLevel.Information, "D0");
+
+ // Act
+ var returned = target.AppendErrors(source);
+
+ // Assert
+ Assert.Same(target, returned);
+ Assert.True(target.Fail);
+ Assert.Equal(2, target.Errors.Count);
+ Assert.NotNull(target.Errors.Single(e => e is { Code: 100, Message: "E0" }));
+ Assert.NotNull(target.Errors.Single(e => e is { Code: 101, Message: "E1" }));
+ }
+
+ [Fact]
+ public void AppendErrors_WithNullSource_On_NonGenericTarget_Returns_Same_Instance_And_NoChange()
+ {
+ // Arrange
+ var target = new OperationResult();
+ target.AppendError("E0", 100, LogLevel.Information, "D0");
+ var beforeCount = target.Errors.Count;
+
+ // Act
+ var returned = target.AppendErrors(null);
+
+ // Assert
+ Assert.Same(target, returned);
+ Assert.Equal(beforeCount, target.Errors.Count);
+ }
+
+ [Fact]
+ public void AppendErrors_WithNullSource_On_GenericTarget_Returns_Same_Instance_And_NoChange()
+ {
+ // Arrange
+ var target = new OperationResult