Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
A partire da .NET 11 RC 1, il generatore di origine di convalida delle opzioni riconosce un'implementazione esplicita di IValidateOptions<TOptions>.Validate come implementazione scritta a mano. Segnala la diagnostica di errore SYSLIB1205 anziché generare un metodo sincrono Validate pubblico separato.
Versione introdotta
.NET 11 RC 1
Comportamento precedente
In precedenza, il generatore di origine non riconosceva un'implementazione esplicita di Validate(String, TOptions) come implementazione esistente. Potrebbe generare un metodo pubblico Validate aggiuntivo, quindi le chiamate di interfaccia usavano l'implementazione scritta a mano mentre le chiamate dirette sul validator concreto usavano il metodo generato. I due percorsi di chiamata potrebbero produrre risultati di convalida diversi.
[OptionsValidator]
public partial class MyValidator : IValidateOptions<MyOptions>
{
ValidateOptionsResult IValidateOptions<MyOptions>.Validate(string? name, MyOptions options)
=> ValidateOptionsResult.Success;
}
Nuovo comportamento
A partire da .NET 11, il generatore di origine riconosce l'implementazione esplicita, segnala SYSLIB1205e elimina la generazione sincrona Validate per il modello di opzioni.
Se il validator implementa anche IAsyncValidateOptions<TOptions>, la generazione sincrona e asincrona rimangono indipendenti. L'implementazione sincrona scritta a mano produce SYSLIB1205 e sopprime i Validate generati, ma il generatore può comunque generare ValidateAsync.
Tipo di cambiamento che interrompe la compatibilità
Questa modifica può influire sulla compatibilità dell'origine.
Motivo della modifica
Il comportamento precedente consentiva alle chiamate di interfaccia di usare la convalida scritta a mano mentre le chiamate dirette usavano una convalida generata separatamente. Il riconoscimento di implementazioni esplicite impedisce che la convalida generata venga aggirata silenziosamente e rimuove questi percorsi di convalida divergenti. Per altre informazioni, vedere dotnet/runtime#130263.
Azione consigliata
Scegliere un proprietario per l'implementazione sincrona Validate .
Per usare la convalida generata dal codice sorgente, mantenere [OptionsValidator] e rimuovere l'implementazione esplicita scritta a mano:
[OptionsValidator]
public partial class MyValidator : IValidateOptions<MyOptions>
{
}
Per gestire direttamente la convalida, rimuovere [OptionsValidator] e implementare manualmente il validator completo:
public sealed class MyValidator : IValidateOptions<MyOptions>
{
public ValidateOptionsResult Validate(string? name, MyOptions options)
=> ValidateOptionsResult.Success;
}
Non esiste un commutatore di compatibilità. La soppressione di SYSLIB1205 non risolve la proprietà in conflitto del metodo.