Nota
O acceso a esta páxina require autorización. Pode tentar iniciar sesión ou modificar os directorios.
O acceso a esta páxina require autorización. Pode tentar modificar os directorios.
A partir de .NET 11 RC 1, el generador de orígenes de validación de opciones reconoce una implementación explícita de IValidateOptions<TOptions>.Validate como una implementación manuscrita. Informa del diagnóstico SYSLIB1205 de errores en lugar de generar un método sincrónico Validate público independiente.
Versión introducida
.NET 11 RC 1
Comportamiento anterior
Anteriormente, el generador de origen no reconoceba una implementación explícita de Validate(String, TOptions) como una implementación existente. Podría generar un método público Validate adicional, por lo que las llamadas de interfaz usaron la implementación manuscrita mientras las llamadas directas en el validador concreto usaban el método generado. Las dos rutas de llamada podrían generar resultados de validación diferentes.
[OptionsValidator]
public partial class MyValidator : IValidateOptions<MyOptions>
{
ValidateOptionsResult IValidateOptions<MyOptions>.Validate(string? name, MyOptions options)
=> ValidateOptionsResult.Success;
}
Nuevo comportamiento
A partir de .NET 11, el generador de origen reconoce la implementación explícita, notifica SYSLIB1205y suprime la generación sincrónica Validate para ese modelo de opciones.
Si el validador también implementa IAsyncValidateOptions<TOptions>, la generación sincrónica y asincrónica permanece independiente. La implementación sincrónica manuscrita genera SYSLIB1205 y suprime las generadas Validate, pero el generador todavía puede emitir ValidateAsync.
Tipo de cambio disruptivo
Este cambio puede afectar a la compatibilidad de origen.
Motivo del cambio
El comportamiento anterior permitía que las llamadas a la interfaz utilizaran una validación personalizada, mientras que las llamadas directas utilizaban una validación generada por separado. El reconocimiento de implementaciones explícitas impide que la validación generada se omita silenciosamente y elimina estas rutas de validación divergentes. Para obtener más información, vea dotnet/runtime#130263.
Acción recomendada
Elija un solo propietario para la implementación sincrónica Validate.
Para usar la validación generada por el origen, mantenga [OptionsValidator] y quite la implementación explícita escrita a mano:
[OptionsValidator]
public partial class MyValidator : IValidateOptions<MyOptions>
{
}
Para administrar la validación manualmente, elimine [OptionsValidator] e implemente usted mismo el validador completo:
public sealed class MyValidator : IValidateOptions<MyOptions>
{
public ValidateOptionsResult Validate(string? name, MyOptions options)
=> ValidateOptionsResult.Success;
}
No hay ningún interruptor de compatibilidad. Desactivar SYSLIB1205 no resuelve el conflicto de propiedad del método.