From e2d67eb5cb2fbfdbe97bfd7164adf8d6fb4e621f Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 30 Jul 2026 08:56:26 +0000 Subject: [PATCH 1/2] Initial plan From eb950339b5bdab5e5e0ff059535906e0415eb870 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 30 Jul 2026 09:22:50 +0000 Subject: [PATCH 2/2] Fix chained provider nullability review feedback Co-authored-by: rosebyte <14963300+rosebyte@users.noreply.github.com> --- .../src/ChainedConfigurationProvider.cs | 4 +-- .../ChainedConfigurationProviderTests.cs | 32 +++++++++++++++++++ 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/src/libraries/Microsoft.Extensions.Configuration/src/ChainedConfigurationProvider.cs b/src/libraries/Microsoft.Extensions.Configuration/src/ChainedConfigurationProvider.cs index b82810acc71e3d..08cec0453bd211 100644 --- a/src/libraries/Microsoft.Extensions.Configuration/src/ChainedConfigurationProvider.cs +++ b/src/libraries/Microsoft.Extensions.Configuration/src/ChainedConfigurationProvider.cs @@ -38,11 +38,11 @@ public ChainedConfigurationProvider(ChainedConfigurationSource source) /// /// The key. /// When this method returns, contains the value. - /// if a value for the specified key was found, otherwise . + /// if the chained configuration has a non- value for the specified key, otherwise . public bool TryGet(string key, out string? value) { value = _config[key]; - return !string.IsNullOrEmpty(value); + return value is not null; } /// diff --git a/src/libraries/Microsoft.Extensions.Configuration/tests/ChainedConfigurationProviderTests.cs b/src/libraries/Microsoft.Extensions.Configuration/tests/ChainedConfigurationProviderTests.cs index 7fde62c4115824..805a235ad17b0e 100644 --- a/src/libraries/Microsoft.Extensions.Configuration/tests/ChainedConfigurationProviderTests.cs +++ b/src/libraries/Microsoft.Extensions.Configuration/tests/ChainedConfigurationProviderTests.cs @@ -153,6 +153,38 @@ public void ChainedConfiguration_ReloadingOuterConfigurationRoot_RaisesSingleOut Assert.Equal(0, innerNotifications); } + [Fact] + public void ChainedConfiguration_TryGetReturnsTrueForEmptyStringValue() + { + IConfigurationProvider provider = new ChainedConfigurationSource + { + Configuration = new ConfigurationBuilder() + .AddInMemoryCollection(new Dictionary { { "Key", string.Empty } }) + .Build(), + ShouldDisposeConfiguration = false, + } + .Build(new ConfigurationBuilder()); + + Assert.True(provider.TryGet("Key", out string? value)); + Assert.Equal(string.Empty, value); + } + + [Fact] + public void ChainedConfiguration_TryGetReturnsFalseForMissingKey() + { + IConfigurationProvider provider = new ChainedConfigurationSource + { + Configuration = new ConfigurationBuilder() + .AddInMemoryCollection(new Dictionary { { "OtherKey", "inner-value" } }) + .Build(), + ShouldDisposeConfiguration = false, + } + .Build(new ConfigurationBuilder()); + + Assert.False(provider.TryGet("MissingKey", out string? value)); + Assert.Null(value); + } + private class TestConfigurationProvider : ConfigurationProvider { public TestConfigurationProvider(string key, string value)