From fed70479e6bddd1dd61151145d4061bfce0f1e5a Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 28 Sep 2026 15:26:31 +0000 Subject: [PATCH] fix: make Join(items, separator, nullItemHandling) reject a null separator [patch] The three-argument overload documented ArgumentNullException for a null separator but passed it straight to string.Join, which treats null as "". It now carries the same guard as the two-argument overload. Fixes #144 Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01VwgZGoivWyqL4pWDsenTPm --- Extensions.Test/EnumerableExtensionsTests.cs | 15 +++++++++++++++ Extensions/EnumerableExtensions.cs | 7 +++++++ 2 files changed, 22 insertions(+) diff --git a/Extensions.Test/EnumerableExtensionsTests.cs b/Extensions.Test/EnumerableExtensionsTests.cs index 459a5bc..6e186ce 100644 --- a/Extensions.Test/EnumerableExtensionsTests.cs +++ b/Extensions.Test/EnumerableExtensionsTests.cs @@ -340,6 +340,21 @@ public void JoinThrowsArgumentNullExceptionWhenSeparatorIsNull() Assert.ThrowsExactly(() => items.Join(separator)); } + [TestMethod] + [DataRow(NullItemHandling.Remove)] + [DataRow(NullItemHandling.Include)] + [DataRow(NullItemHandling.Throw)] + public void JoinWithNullItemHandlingThrowsArgumentNullExceptionWhenSeparatorIsNull(NullItemHandling nullItemHandling) + { + // Arrange + List items = ["a", "b", "c"]; + string separator = null!; + + // Act & Assert + ArgumentNullException exception = Assert.ThrowsExactly(() => items.Join(separator, nullItemHandling)); + Assert.AreEqual("separator", exception.ParamName); + } + [TestMethod] public void JoinWithNullItemHandlingRemoveRemovesNullItems() { diff --git a/Extensions/EnumerableExtensions.cs b/Extensions/EnumerableExtensions.cs index 636c125..1e5c637 100644 --- a/Extensions/EnumerableExtensions.cs +++ b/Extensions/EnumerableExtensions.cs @@ -259,6 +259,13 @@ public static string Join(this IEnumerable items, string separator, NullIt } #pragma warning restore KTSU0004 // Use Ensure.NotNull instead of manual null check +#pragma warning disable KTSU0004 // Use Ensure.NotNull instead of manual null check + if (separator is null) + { + throw new ArgumentNullException(nameof(separator), "Separator cannot be null."); + } +#pragma warning restore KTSU0004 // Use Ensure.NotNull instead of manual null check + if (nullItemHandling is NullItemHandling.Throw) { if (items.AnyNull())