Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
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.
Ação recomendada
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.