O gerador de validação de opções emite o SYSLIB1205 para implementações explícitas de Validate

A partir do .NET 11 RC 1, o gerador fonte de validação de opções reconhece uma implementação explícita de IValidateOptions<TOptions>.Validate como uma implementação manuscrita. Reporta o diagnóstico SYSLIB1205 de erro em vez de gerar um método síncrono Validate público separado.

Versão introduzida

.NET 11 RC 1

Comportamento anterior

Anteriormente, o gerador de código-fonte não reconhecia uma implementação explícita de Validate(String, TOptions) como uma implementação existente. Podia gerar um método público Validate adicional, de modo que as chamadas de interface usavam a implementação manuscrita, enquanto as chamadas diretas no validador concreto usavam o método gerado. Os dois caminhos de chamada podiam produzir resultados de validação diferentes.

[OptionsValidator]
public partial class MyValidator : IValidateOptions<MyOptions>
{
    ValidateOptionsResult IValidateOptions<MyOptions>.Validate(string? name, MyOptions options)
        => ValidateOptionsResult.Success;
}

Novo comportamento

A partir do .NET 11, o gerador de origem reconhece a implementação explícita, reporta SYSLIB1205, e suprime a geração síncrona Validate para esse modelo de opções.

Se o validador também implementar IAsyncValidateOptions<TOptions>, a geração síncrona e assíncrona mantém-se independente. A implementação síncrona manuscrita produz SYSLIB1205 e suprime gerados Validate, mas o gerador ainda pode emitir ValidateAsync.

Tipo de mudança disruptiva

Essa alteração pode afetar a compatibilidade da fonte.

Motivo da mudança

O comportamento anterior permitia que as chamadas de interface usassem validação manuscrita, enquanto chamadas diretas usavam validação gerada separadamente. Reconhecer implementações explícitas impede que a validação gerada seja ignorada silenciosamente e remove estes caminhos de validação divergentes. Para mais informações, veja dotnet/runtime#130263.

Escolha um único proprietário para a implementação síncrona Validate.

Para usar validação gerada pela fonte, mantenha [OptionsValidator] e remova a implementação explícita manuscrita:

[OptionsValidator]
public partial class MyValidator : IValidateOptions<MyOptions>
{
}

Para controlar a validação manualmente, remova [OptionsValidator] e implemente o validador completo você mesmo:

public sealed class MyValidator : IValidateOptions<MyOptions>
{
    public ValidateOptionsResult Validate(string? name, MyOptions options)
        => ValidateOptionsResult.Success;
}

Não existe comutador de compatibilidade. Suprimir SYSLIB1205 não resolve a propriedade em conflito do método.

APIs afetadas