Il generatore di convalida delle opzioni segnala SYSLIB1205 per le implementazioni Validate esplicite

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.

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.

Le API interessate