ConfigurationBinder omite silenciosamente elementos de matriz no válidos

A partir de .NET 8, ConfigurationBinder omite silenciosamente los elementos de matriz y lista cuyos valores no se pueden convertir al tipo de destino. Anteriormente, los elementos con errores se conservaban como null marcadores de posición y la colección resultante conservaba la misma longitud que el número de elementos del origen de configuración.

Versión introducida

.NET 8

Comportamiento anterior

Anteriormente, al enlazar una matriz o lista mediante Get<T>(IConfiguration) o Bind(IConfiguration, Object), si el valor de un elemento no se podía convertir al tipo de destino, ese elemento se conservaba como marcador de posición null en el resultado. La longitud de la colección coincide con el número de elementos de la configuración.

// 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)

Nuevo comportamiento

A partir de .NET 8, los elementos que producen un error en la conversión de tipos se omiten de forma silenciosa. La colección resultante solo contiene elementos enlazados correctamente y tiene una longitud más corta que el número de entradas del origen de configuración.

var settings = configuration.GetSection("Items").Get<MyItem[]>();

// .NET 8+ result:
// settings.Length == 1
// settings[0] = { Name = "A", Interval = 10 }

Tipo de cambio disruptivo

Este es un cambio de comportamiento.

Motivo del cambio

La implementación interna de ConfigurationBinder se refactorizó en .NET 8. En lugar de asignar previamente la matriz de destino y asociar los elementos en contexto (que dejaron null ante un error de conversión), el enlazador ahora solo recopila los elementos vinculados correctamente en una lista temporal antes de crear la matriz final.

El comportamiento anterior también era problemático para los tipos de valor, como int[]. Para un valor de configuración no válido, el enlazador almacenaría 0, que era indistinguible de un valor legítimo de 0. El nuevo comportamiento evita esta ambigüedad.

  • Habilite ErrorOnUnknownConfiguration durante el desarrollo para exponer valores de configuración no válidos inmediatamente en lugar de quitar elementos de forma silenciosa:

    var settings = configuration.GetSection("Items").Get<MyItem[]>(options =>
        options.ErrorOnUnknownConfiguration = true);
    

    A partir de .NET 8, esta opción también hace que ConfigurationBinder lance una InvalidOperationException cuando un valor no se pueda convertir al tipo de destino. Para obtener más información, consulte ConfigurationBinder lanza una excepción por un valor no coincidente.

  • Corrija valores de configuración no válidos. Asegúrese de que todos los valores del origen de configuración coinciden con los tipos esperados para el modelo enlazado.

  • Valide las longitudes de las colecciones después del enlace si el código depende del número de elementos que correspondan al origen de configuración.

  • Use propiedades de cadena con análisis manual si necesita manejar adecuadamente los valores no convertibles y preservar todas las entradas del array.

Las APIs afectadas