Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
À compter de .NET 8, ConfigurationBinder ignore silencieusement les éléments de tableau et de liste dont les valeurs ne peuvent pas être converties en type cible. Auparavant, les éléments échoués étaient conservés en tant que null placeholders, et la collection résultante avait une longueur égale au nombre d'éléments de la source de configuration.
Version introduite
.NET 8
Comportement antérieur
Auparavant, lors de la liaison d’une propriété de tableau ou de liste via Get<T>(IConfiguration) ou Bind(IConfiguration, Object), si la valeur d’un élément n’a pas pu être convertie en type cible, cet élément a été conservé en tant qu’espace null réservé dans le résultat. La longueur de la collection correspond au nombre d’éléments de la configuration.
// Configuration source, for example, appsettings.json:
// "Items": [
// { "Name": "A", "Interval": 10 },
// { "Name": "B", "Interval": "a" } <-- invalid int
// ]
var settings = configuration.GetSection("Items").Get<MyItem[]>();
// .NET 6/7 result:
// settings.Length == 2
// settings[0] = { Name = "A", Interval = 10 }
// settings[1] = null (conversion failed, placeholder preserved)
Nouveau comportement
À compter de .NET 8, les éléments qui échouent à la conversion de type sont ignorés en mode silencieux. La collection résultante contient uniquement des éléments liés avec succès et a une longueur plus courte que le nombre d’entrées dans la source de configuration.
var settings = configuration.GetSection("Items").Get<MyItem[]>();
// .NET 8+ result:
// settings.Length == 1
// settings[0] = { Name = "A", Interval = 10 }
Type de changement cassant
Ce changement est un changement de comportement.
Raison du changement
L’implémentation interne de ConfigurationBinder a été refactorisée dans .NET 8. Au lieu de préallouer le tableau cible et de lier les éléments sur place (ce qui laissait null en cas d'échec de conversion), le classeur collecte désormais uniquement les éléments liés avec succès dans une liste temporaire avant de constituer le tableau final.
Le comportement précédent était également problématique pour les types valeur tels que int[]. Pour une valeur de configuration non valide, le classeur stockerait 0, qui était indistinguishable d’une valeur légitime de 0. Le nouveau comportement évite cette ambiguïté.
Action recommandée
Activez ErrorOnUnknownConfiguration pendant le développement pour afficher immédiatement les valeurs de configuration non valides plutôt que de supprimer les éléments en silence :
var settings = configuration.GetSection("Items").Get<MyItem[]>(options => options.ErrorOnUnknownConfiguration = true);À compter de .NET 8, cette option entraîne également ConfigurationBinder à lever une InvalidOperationException lorsqu’une valeur ne peut pas être convertie en type cible. Pour plus d’informations, consultez ConfigurationBinder lève une exception pour une valeur non correspondante.
Corrigez les valeurs de configuration non valides. Vérifiez que toutes les valeurs de votre source de configuration correspondent aux types attendus pour le modèle lié.
Validez les longueurs de collection après la liaison si votre code dépend du nombre d’éléments correspondant à la source de configuration.
Utilisez des propriétés de chaîne avec l’analyse manuelle si vous devez gérer correctement les valeurs nonconvertibles et conserver toutes les entrées de tableau.
API affectées
- Microsoft.Extensions.Configuration.ConfigurationBinder.Get<T>(IConfiguration)
- Microsoft.Extensions.Configuration.ConfigurationBinder.Get<T>(IConfiguration, Action<BinderOptions>)
- Microsoft.Extensions.Configuration.ConfigurationBinder.Bind(IConfiguration, Object)
- Microsoft.Extensions.Configuration.ConfigurationBinder.Bind(IConfiguration, Object, Action<BinderOptions>)