Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los 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 de interfaz usaran la validación manuscrita, mientras que las llamadas directas usaban 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 encargarse usted mismo de la validación manual, quite [OptionsValidator] e implemente el validador completo usted mismo:
public sealed class MyValidator : IValidateOptions<MyOptions>
{
public ValidateOptionsResult Validate(string? name, MyOptions options)
=> ValidateOptionsResult.Success;
}
No hay ningún interruptor de compatibilidad. Suprimir SYSLIB1205 no resuelve la propiedad en conflicto del método.