diff --git a/AGENTS.md b/AGENTS.md
new file mode 100644
index 0000000000..49356716e6
--- /dev/null
+++ b/AGENTS.md
@@ -0,0 +1,3 @@
+# Agents
+
+See [CLAUDE.md](CLAUDE.md).
diff --git a/Directory.Packages.props b/Directory.Packages.props
index 71b4e523f7..1687ba004a 100644
--- a/Directory.Packages.props
+++ b/Directory.Packages.props
@@ -100,14 +100,14 @@
-
+
-
-
-
-
-
+
+
+
+
+
diff --git a/SourceGenerationDebug.props b/SourceGenerationDebug.props
index ee0bad18a5..46581de60d 100644
--- a/SourceGenerationDebug.props
+++ b/SourceGenerationDebug.props
@@ -1,11 +1,14 @@
- true
- SourceGeneratedViewer
+ true
+ SourceGeneratedViewer
-
+
+
+
+
diff --git a/TUnit.Assertions.Tests/Bugs/Issue5720Tests.cs b/TUnit.Assertions.Tests/Bugs/Issue5720Tests.cs
index 7081355ec3..eb28eb2cbd 100644
--- a/TUnit.Assertions.Tests/Bugs/Issue5720Tests.cs
+++ b/TUnit.Assertions.Tests/Bugs/Issue5720Tests.cs
@@ -1,3 +1,5 @@
+// Gated to match ImplicitConversionEqualityExtensions.cs — see issue #5765.
+#if NET9_0_OR_GREATER
namespace TUnit.Assertions.Tests.Bugs;
///
@@ -191,3 +193,5 @@ await Assert.That(assertionException.InnerException!.Message).StartsWith(
$"No implicit conversion operator from '{typeof(UnrelatedType)}' to '{typeof(string)}' was found.");
}
}
+
+#endif
diff --git a/TUnit.Assertions.Tests/Bugs/Issue5765Tests.cs b/TUnit.Assertions.Tests/Bugs/Issue5765Tests.cs
new file mode 100644
index 0000000000..c63b38d8e4
--- /dev/null
+++ b/TUnit.Assertions.Tests/Bugs/Issue5765Tests.cs
@@ -0,0 +1,40 @@
+using System.Net;
+
+namespace TUnit.Assertions.Tests.Bugs;
+
+public class Issue5765Tests
+{
+ [Test]
+ public async Task IsEqualTo_SameType_Enum()
+ {
+ var status = HttpStatusCode.OK;
+
+ await Assert.That(status).IsEqualTo(HttpStatusCode.OK);
+ }
+
+ [Test]
+ public async Task IsEqualTo_SameType_Primitive()
+ {
+ var value = 42;
+
+ await Assert.That(value).IsEqualTo(42);
+ }
+
+ [Test]
+ public async Task IsEqualTo_SameType_Record()
+ {
+ var point = new Point(1, 2);
+
+ await Assert.That(point).IsEqualTo(new Point(1, 2));
+ }
+
+ [Test]
+ public async Task IsNotEqualTo_SameType_Enum()
+ {
+ var status = HttpStatusCode.OK;
+
+ await Assert.That(status).IsNotEqualTo(HttpStatusCode.NotFound);
+ }
+
+ private sealed record Point(int X, int Y);
+}
diff --git a/TUnit.Assertions/Extensions/ImplicitConversionEqualityExtensions.cs b/TUnit.Assertions/Extensions/ImplicitConversionEqualityExtensions.cs
index e9c792fde8..b91c0e0486 100644
--- a/TUnit.Assertions/Extensions/ImplicitConversionEqualityExtensions.cs
+++ b/TUnit.Assertions/Extensions/ImplicitConversionEqualityExtensions.cs
@@ -1,3 +1,8 @@
+// Gated to .NET 9+ because these overloads rely on [OverloadResolutionPriority] to
+// lose to the source-generated single-generic IsEqualTo / IsNotEqualTo on same-type
+// calls, and that attribute is silently dropped on net8.0 / netstandard2.0 (Polyfill
+// does not supply it), causing CS0121. See issue #5765.
+#if NET9_0_OR_GREATER
using System.Collections.Concurrent;
using System.Diagnostics.CodeAnalysis;
using System.Reflection;
@@ -146,3 +151,4 @@ internal static class ImplicitConversionCache
return null;
}
}
+#endif
diff --git a/TUnit.Engine.Tests/Issue5753Tests.cs b/TUnit.Engine.Tests/Issue5753Tests.cs
new file mode 100644
index 0000000000..88bd2ff542
--- /dev/null
+++ b/TUnit.Engine.Tests/Issue5753Tests.cs
@@ -0,0 +1,35 @@
+using Shouldly;
+using TUnit.Engine.Tests.Enums;
+
+namespace TUnit.Engine.Tests;
+
+public class Issue5753Tests(TestMode testMode) : InvokableTestBase(testMode)
+{
+ [Test]
+ public async Task ReflectionPropertyInjection_DoesNotOverwriteExistingValue()
+ {
+ await RunTestsWithFilter(
+ "/*/*/Issue5753ReflectionPropertyInjectionTests/*",
+ [
+ result => result.ResultSummary.Outcome.ShouldBe("Completed"),
+ result => result.ResultSummary.Counters.Total.ShouldBe(1),
+ result => result.ResultSummary.Counters.Passed.ShouldBe(1),
+ result => result.ResultSummary.Counters.Failed.ShouldBe(0),
+ result => result.ResultSummary.Counters.NotExecuted.ShouldBe(0)
+ ]);
+ }
+
+ [Test]
+ public async Task ValueTypePropertyInjection_DoesNotTreatDefaultValueAsAlreadyPopulated()
+ {
+ await RunTestsWithFilter(
+ "/*/*/Issue5753ValueTypePropertyInjectionTests/*",
+ [
+ result => result.ResultSummary.Outcome.ShouldBe("Completed"),
+ result => result.ResultSummary.Counters.Total.ShouldBe(1),
+ result => result.ResultSummary.Counters.Passed.ShouldBe(1),
+ result => result.ResultSummary.Counters.Failed.ShouldBe(0),
+ result => result.ResultSummary.Counters.NotExecuted.ShouldBe(0)
+ ]);
+ }
+}
diff --git a/TUnit.Engine/Services/PropertyInjector.cs b/TUnit.Engine/Services/PropertyInjector.cs
index 7037082b48..a16767e55d 100644
--- a/TUnit.Engine/Services/PropertyInjector.cs
+++ b/TUnit.Engine/Services/PropertyInjector.cs
@@ -252,17 +252,10 @@ private async Task InjectSourceGeneratedPropertyAsync(
ConcurrentDictionary