Skip to content

Commit 3670dec

Browse files
Merge pull request #47896 from dotnet/main
Merge main into live
2 parents 9f2befd + 99ce071 commit 3670dec

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+464
-162
lines changed

docs/azure/includes/dotnet-all.md

Lines changed: 13 additions & 13 deletions
Large diffs are not rendered by default.

docs/azure/includes/dotnet-new.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,9 @@
3434
| Core - Client - Core | NuGet [1.47.1](https://www.nuget.org/packages/Azure.Core/1.47.1) | [docs](/dotnet/api/overview/azure/Core-readme) | GitHub [1.47.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Core_1.47.1/sdk/core/Azure.Core/) |
3535
| Core Newtonsoft Json | NuGet [2.0.0](https://www.nuget.org/packages/Microsoft.Azure.Core.NewtonsoftJson/2.0.0) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.Core.NewtonsoftJson-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.Core.NewtonsoftJson_2.0.0/sdk/core/Microsoft.Azure.Core.NewtonsoftJson/) |
3636
| Core WCF Storage Queues | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Microsoft.CoreWCF.Azure.StorageQueues/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Microsoft.CoreWCF.Azure.StorageQueues-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.CoreWCF.Azure.StorageQueues_1.0.0-beta.1/sdk/extension-wcf/Microsoft.CoreWCF.Azure.StorageQueues/) |
37-
| Data Movement | NuGet [12.2.0](https://www.nuget.org/packages/Azure.Storage.DataMovement/12.2.0) | [docs](/dotnet/api/overview/azure/Storage.DataMovement-readme) | GitHub [12.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Storage.DataMovement_12.2.0/sdk/storage/Azure.Storage.DataMovement/) |
38-
| Data Movement - Blobs | NuGet [12.2.0](https://www.nuget.org/packages/Azure.Storage.DataMovement.Blobs/12.2.0) | [docs](/dotnet/api/overview/azure/Storage.DataMovement.Blobs-readme) | GitHub [12.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Storage.DataMovement.Blobs_12.2.0/sdk/storage/Azure.Storage.DataMovement.Blobs/) |
39-
| Data Movement - Files Shares | NuGet [12.2.0](https://www.nuget.org/packages/Azure.Storage.DataMovement.Files.Shares/12.2.0) | [docs](/dotnet/api/overview/azure/Storage.DataMovement.Files.Shares-readme) | GitHub [12.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Storage.DataMovement.Files.Shares_12.2.0/sdk/storage/Azure.Storage.DataMovement.Files.Shares/) |
37+
| Data Movement | NuGet [12.2.1](https://www.nuget.org/packages/Azure.Storage.DataMovement/12.2.1) | [docs](/dotnet/api/overview/azure/Storage.DataMovement-readme) | GitHub [12.2.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Storage.DataMovement_12.2.1/sdk/storage/Azure.Storage.DataMovement/) |
38+
| Data Movement - Blobs | NuGet [12.2.1](https://www.nuget.org/packages/Azure.Storage.DataMovement.Blobs/12.2.1) | [docs](/dotnet/api/overview/azure/Storage.DataMovement.Blobs-readme) | GitHub [12.2.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Storage.DataMovement.Blobs_12.2.1/sdk/storage/Azure.Storage.DataMovement.Blobs/) |
39+
| Data Movement - Files Shares | NuGet [12.2.1](https://www.nuget.org/packages/Azure.Storage.DataMovement.Files.Shares/12.2.1) | [docs](/dotnet/api/overview/azure/Storage.DataMovement.Files.Shares-readme) | GitHub [12.2.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Storage.DataMovement.Files.Shares_12.2.1/sdk/storage/Azure.Storage.DataMovement.Files.Shares/) |
4040
| Defender EASM | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Analytics.Defender.Easm/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Analytics.Defender.Easm-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Analytics.Defender.Easm_1.0.0-beta.1/sdk/easm/Azure.Analytics.Defender.Easm/) |
4141
| Dev Center | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Developer.DevCenter/1.0.0) | [docs](/dotnet/api/overview/azure/Developer.DevCenter-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Developer.DevCenter_1.0.0/sdk/devcenter/Azure.Developer.DevCenter/) |
4242
| Device Update | NuGet [1.0.0](https://www.nuget.org/packages/Azure.IoT.DeviceUpdate/1.0.0) | [docs](/dotnet/api/overview/azure/IoT.DeviceUpdate-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.IoT.DeviceUpdate_1.0.0/sdk/deviceupdate/Azure.IoT.DeviceUpdate/) |
@@ -81,13 +81,13 @@
8181
| Monitor Query | NuGet [1.7.0](https://www.nuget.org/packages/Azure.Monitor.Query/1.7.0) | [docs](/dotnet/api/overview/azure/Monitor.Query-readme) | GitHub [1.7.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Monitor.Query_1.7.0/sdk/monitor/Azure.Monitor.Query/) |
8282
| NUnit ? Microsoft Playwright Testing | NuGet [1.0.0-beta.4](https://www.nuget.org/packages/Azure.Developer.MicrosoftPlaywrightTesting.NUnit/1.0.0-beta.4) | [docs](/dotnet/api/overview/azure/Developer.MicrosoftPlaywrightTesting.NUnit-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Developer.MicrosoftPlaywrightTesting.NUnit_1.0.0-beta.4/sdk/playwrighttesting/Azure.Developer.MicrosoftPlaywrightTesting.NUnit/) |
8383
| OpenAI Assistants | NuGet [1.0.0-beta.4](https://www.nuget.org/packages/Azure.AI.OpenAI.Assistants/1.0.0-beta.4) | [docs](/dotnet/api/overview/azure/AI.OpenAI.Assistants-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.OpenAI.Assistants_1.0.0-beta.4/sdk/openai/Azure.AI.OpenAI.Assistants/) |
84-
| OpenAI Inference | NuGet [2.1.0](https://www.nuget.org/packages/Azure.AI.OpenAI/2.1.0)<br>NuGet [2.2.0-beta.5](https://www.nuget.org/packages/Azure.AI.OpenAI/2.2.0-beta.5) | [docs](/dotnet/api/overview/azure/AI.OpenAI-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.OpenAI_2.1.0/sdk/openai/Azure.AI.OpenAI/)<br>GitHub [2.2.0-beta.5](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.OpenAI_2.2.0-beta.5/sdk/openai/Azure.AI.OpenAI/) |
84+
| OpenAI Inference | NuGet [2.1.0](https://www.nuget.org/packages/Azure.AI.OpenAI/2.1.0)<br>NuGet [2.3.0-beta.1](https://www.nuget.org/packages/Azure.AI.OpenAI/2.3.0-beta.1) | [docs](/dotnet/api/overview/azure/AI.OpenAI-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.OpenAI_2.1.0/sdk/openai/Azure.AI.OpenAI/)<br>GitHub [2.3.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.OpenAI_2.3.0-beta.1/sdk/openai/Azure.AI.OpenAI/) |
8585
| OpenTelemetry AspNetCore | NuGet [1.3.0](https://www.nuget.org/packages/Azure.Monitor.OpenTelemetry.AspNetCore/1.3.0) | [docs](/dotnet/api/overview/azure/Monitor.OpenTelemetry.AspNetCore-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Monitor.OpenTelemetry.AspNetCore_1.3.0/sdk/monitor/Azure.Monitor.OpenTelemetry.AspNetCore/) |
8686
| OpenTelemetry Exporter | NuGet [1.4.0](https://www.nuget.org/packages/Azure.Monitor.OpenTelemetry.Exporter/1.4.0) | [docs](/dotnet/api/overview/azure/Monitor.OpenTelemetry.Exporter-readme) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Monitor.OpenTelemetry.Exporter_1.4.0/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/) |
8787
| OpenTelemetry LiveMetrics | NuGet [1.0.0-beta.3](https://www.nuget.org/packages/Azure.Monitor.OpenTelemetry.LiveMetrics/1.0.0-beta.3) | [docs](/dotnet/api/overview/azure/Monitor.OpenTelemetry.LiveMetrics-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Monitor.OpenTelemetry.LiveMetrics_1.0.0-beta.3/sdk/monitor/Azure.Monitor.OpenTelemetry.LiveMetrics/) |
8888
| Personalizer | NuGet [2.0.0-beta.2](https://www.nuget.org/packages/Azure.AI.Personalizer/2.0.0-beta.2) | [docs](/dotnet/api/overview/azure/AI.Personalizer-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [2.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Personalizer_2.0.0-beta.2/sdk/personalizer/Azure.AI.Personalizer/) |
89-
| Playwright | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Developer.Playwright/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Developer.Playwright-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Developer.Playwright_1.0.0-beta.1/sdk/loadtestservice/Azure.Developer.Playwright/) |
90-
| Playwright NUnit | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Developer.Playwright.NUnit/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Developer.Playwright.NUnit-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Developer.Playwright.NUnit_1.0.0-beta.1/sdk/loadtestservice/Azure.Developer.Playwright.NUnit/) |
89+
| Playwright | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.Developer.Playwright/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/Developer.Playwright-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Developer.Playwright_1.0.0-beta.2/sdk/loadtestservice/Azure.Developer.Playwright/) |
90+
| Playwright NUnit | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.Developer.Playwright.NUnit/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/Developer.Playwright.NUnit-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Developer.Playwright.NUnit_1.0.0-beta.2/sdk/loadtestservice/Azure.Developer.Playwright.NUnit/) |
9191
| Programmable Connectivity | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Communication.ProgrammableConnectivity/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Communication.ProgrammableConnectivity-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Communication.ProgrammableConnectivity_1.0.0-beta.1/sdk/communication/Azure.Communication.ProgrammableConnectivity/) |
9292
| Provisioning | NuGet [1.3.0](https://www.nuget.org/packages/Azure.Provisioning/1.3.0) | [docs](/dotnet/api/overview/azure/Provisioning-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning_1.3.0/sdk/provisioning/Azure.Provisioning/) |
9393
| Provisioning - Resources | NuGet [0.2.0](https://www.nuget.org/packages/Azure.Provisioning.Resources/0.2.0) | [docs](/dotnet/api/overview/azure/Provisioning.Resources-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [0.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.Resources_0.2.0/sdk/provisioning/Azure.Provisioning.Resources/) |
@@ -336,7 +336,7 @@
336336
| Resource Management - Playwright Testing | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.PlaywrightTesting/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.PlaywrightTesting-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.PlaywrightTesting_1.0.0/sdk/playwrighttesting/Azure.ResourceManager.PlaywrightTesting/) |
337337
| Resource Management - Policy Insights | NuGet [1.2.1](https://www.nuget.org/packages/Azure.ResourceManager.PolicyInsights/1.2.1) | [docs](/dotnet/api/overview/azure/ResourceManager.PolicyInsights-readme) | GitHub [1.2.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.PolicyInsights_1.2.1/sdk/policyinsights/Azure.ResourceManager.PolicyInsights/) |
338338
| Resource Management - Portalservicescopilot | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.PortalServicesCopilot/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.PortalServicesCopilot-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.PortalServicesCopilot_1.0.0-beta.1/sdk/portalservices/Azure.ResourceManager.PortalServicesCopilot/) |
339-
| Resource Management - PostgreSQL | NuGet [1.3.0](https://www.nuget.org/packages/Azure.ResourceManager.PostgreSql/1.3.0) | [docs](/dotnet/api/overview/azure/ResourceManager.PostgreSql-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.PostgreSql_1.3.0/sdk/postgresql/Azure.ResourceManager.PostgreSql/) |
339+
| Resource Management - PostgreSQL | NuGet [1.3.1](https://www.nuget.org/packages/Azure.ResourceManager.PostgreSql/1.3.1) | [docs](/dotnet/api/overview/azure/ResourceManager.PostgreSql-readme) | GitHub [1.3.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.PostgreSql_1.3.1/sdk/postgresql/Azure.ResourceManager.PostgreSql/) |
340340
| Resource Management - Power BI Dedicated | NuGet [1.0.0-beta.5](https://www.nuget.org/packages/Azure.ResourceManager.PowerBIDedicated/1.0.0-beta.5) | [docs](/dotnet/api/overview/azure/ResourceManager.PowerBIDedicated-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.5](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.PowerBIDedicated_1.0.0-beta.5/sdk/powerbidedicated/Azure.ResourceManager.PowerBIDedicated/) |
341341
| Resource Management - Private DNS | NuGet [1.2.1](https://www.nuget.org/packages/Azure.ResourceManager.PrivateDns/1.2.1) | [docs](/dotnet/api/overview/azure/ResourceManager.PrivateDns-readme) | GitHub [1.2.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.PrivateDns_1.2.1/sdk/privatedns/Azure.ResourceManager.PrivateDns/) |
342342
| Resource Management - Provider Hub | NuGet [1.1.1](https://www.nuget.org/packages/Azure.ResourceManager.ProviderHub/1.1.1) | [docs](/dotnet/api/overview/azure/ResourceManager.ProviderHub-readme) | GitHub [1.1.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ProviderHub_1.1.1/sdk/providerhub/Azure.ResourceManager.ProviderHub/) |

docs/core/compatibility/10.0.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ If you're migrating an app to .NET 10, the breaking changes listed here might af
4141

4242
| Title | Type of change | Introduced version |
4343
|-------|---------------------|--------------------|
44+
| [Null values preserved in configuration](extensions/10.0/configuration-null-values-preserved.md) | Behavioral change | Preview 7 |
45+
| [Message no longer duplicated in Console log output](extensions/10.0/console-json-logging-duplicate-messages.md) | Behavioral change | Preview 7 |
4446
| [ProviderAliasAttribute moved to Microsoft.Extensions.Logging.Abstractions assembly](extensions/10.0/provideraliasattribute-moved-assembly.md) | Source incompatible | Preview 4 |
4547
| [Removed DynamicallyAccessedMembers annotation from trim-unsafe Microsoft.Extensions.Configuration code](extensions/10.0/dynamically-accessed-members-configuration.md) | Binary incompatible | Preview 6 |
4648

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
---
2+
title: "Breaking change: Null values preserved in configuration"
3+
description: "Learn about the breaking change in .NET 10 where configuration providers now preserve null values instead of treating them as missing values."
4+
ms.date: 08/07/2025
5+
ai-usage: ai-assisted
6+
ms.custom: https://github.com/dotnet/docs/issues/46890
7+
---
8+
9+
# Null values preserved in configuration
10+
11+
The .NET configuration binder retrieves configuration values via configuration providers and attempts to bind those values to object properties. Previously, when a configuration value was null, the binder treated it as if the value didn't exist at all, and therefore skipped the binding. In other words, it did not distinguish between `null` values and missing values. This behavior caused significant confusion for users who expected explicitly defined `null` values in their configuration to be respected and properly bound.
12+
13+
Additionally, the JSON configuration provider previously converted `null` values in the configuration to empty strings. This further contributed to confusion, as properties bound to these values would receive an empty string rather than the expected null.
14+
15+
This change addresses both issues. The JSON configuration provider now correctly reports `null` values without altering them, and the binder treats `null` values as valid inputs, binding them like any other value.
16+
17+
The update also includes improvements to support binding `null` values within arrays and enables binding of empty arrays.
18+
19+
## Version introduced
20+
21+
.NET 10 Preview 7
22+
23+
## Previous behavior
24+
25+
Previously, when a configuration value was `null`, the binder treated it as if the value didn't exist at all, and therefore skipped the binding. The system didn't distinguish between `null` values and missing values.
26+
27+
Additionally, the JSON configuration provider converted `null` values in the configuration to empty strings. This caused properties bound to these values to receive an empty string rather than the expected `null`.
28+
29+
Consider the following configuration file `appsettings.json` contents:
30+
31+
```json
32+
{
33+
"NullConfiguration": {
34+
"StringProperty": null,
35+
"IntProperty": null,
36+
"Array1": [null, null],
37+
"Array2": []
38+
}
39+
}
40+
```
41+
42+
And the corresponding binding code:
43+
44+
```csharp
45+
public class NullConfiguration
46+
{
47+
public NullConfiguration()
48+
{
49+
// Initialize with non-default value to
50+
// ensure binding overrides these values.
51+
StringProperty = "Initial Value";
52+
IntProperty = 123;
53+
}
54+
public string? StringProperty { get; set; }
55+
public int? IntProperty { get; set; }
56+
public string[]? Array1 { get; set; }
57+
public string[]? Array2 { get; set; }
58+
}
59+
60+
var configuration = new ConfigurationBuilder()
61+
.AddJsonFile("appsettings.json")
62+
.Build().GetSection("NullConfiguration");
63+
64+
// Now bind the configuration.
65+
NullConfiguration? result = configuration.Get<NullConfiguration>();
66+
67+
Console.WriteLine($"StringProperty: '{result!.StringProperty}', intProperty: {(result!.IntProperty.HasValue ? result!.IntProperty : "null")}");
68+
Console.WriteLine($"Array1: {(result!.Array1 is null ?
69+
"null" : string.Join(", ", result!.Array1.Select(a => $"'{(a is null ? "null" : a)}'")))}");
70+
Console.WriteLine($"Array2: {(result!.Array2 is null ?
71+
"null" : string.Join(", ", result!.Array2.Select(a => $"'{(a is null ? "null" : a)}'")))}");
72+
```
73+
74+
Output:
75+
76+
```txt
77+
StringProperty: '', intProperty: 123
78+
Array1: '', ''
79+
Array2: null
80+
```
81+
82+
Explanation of the output:
83+
84+
- `StringProperty`: The `null` value in the JSON was converted by the JSON provider into an empty string (""), overwriting the initial value.
85+
- `IntProperty`: Remained unchanged (123) because the provider converted `null` to an empty string, which couldn't be parsed as an `int?`, so the original value was retained.
86+
- `Array1`: Bound to an array containing two empty strings because each `null` array element was treated as an empty string.
87+
- `Array2`: Remained `null` since an empty array `[]` in the JSON was ignored by the binder.
88+
89+
## New behavior
90+
91+
Starting in .NET 10, `null` values are now properly bound to their corresponding properties, including array elements. Even empty arrays are correctly recognized and bound as empty arrays rather than being ignored.
92+
93+
Running the same code sample produces the following results using the JSON configuration provider:
94+
95+
```txt
96+
StringProperty: 'null', intProperty: null
97+
Array1: 'null', 'null'
98+
Array2:
99+
```
100+
101+
## Type of breaking change
102+
103+
This is a [behavioral change](../../categories.md#behavioral-change).
104+
105+
## Reason for change
106+
107+
The previous behavior was confusing and frequently led to user complaints. By addressing this issue, the configuration binding process is now more intuitive and consistent, reducing confusion and aligning the behavior with user expectations.
108+
109+
## Recommended action
110+
111+
If you prefer the previous behavior, you can adjust your configuration accordingly:
112+
113+
- When using the JSON configuration provider, replace `null` values with empty strings (`""`) to restore the original behavior, where empty strings are bound instead of `null`.
114+
- For other providers that support `null` values, remove the `null` entries from the configuration to replicate the earlier behavior, where missing values are ignored and existing property values remain unchanged.
115+
116+
## Affected APIs
117+
118+
- <xref:Microsoft.Extensions.Configuration> APIs

0 commit comments

Comments
 (0)