Der Optionsüberprüfungsgenerator meldet SYSLIB1205 für explizite Validate-Implementierungen

Ab .NET 11 RC 1 erkennt der Optionsüberprüfungsquellengenerator eine explizite Implementierung von IValidateOptions<TOptions>.Validate als handschriftliche Implementierung. Sie meldet die Fehlerdiagnose SYSLIB1205 , anstatt eine separate öffentliche synchrone Validate Methode zu generieren.

Eingeführt in Version

.NET 11 RC 1

Bisheriges Verhalten

Zuvor hat der Quellgenerator keine explizite Implementierung von Validate(String, TOptions) als vorhandene Implementierung erkannt. Sie könnte eine zusätzliche öffentliche Validate Methode generieren, sodass Schnittstellenaufrufe die manuell geschriebene Implementierung verwendeten, während direkte Aufrufe des konkreten Validators die generierte Methode verwendeten. Die beiden Aufrufpfade könnten unterschiedliche Validierungsergebnisse erzeugen.

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

Neues Verhalten

Ab .NET 11 erkennt der Quellgenerator die explizite Implementierung, meldet SYSLIB1205 und unterdrückt die synchrone Validate Generierung für dieses Optionsmodell.

Wenn der Validator auch IAsyncValidateOptions<TOptions> implementiert, bleiben synchrone und asynchrone Generierung unabhängig. Die handgeschriebene synchrone Implementierung erzeugt SYSLIB1205 und unterdrückt die Generierung von Validate, aber der Generator kann trotzdem ValidateAsync emittieren.

Art der einschneidenden Änderung

Diese Änderung kann sich auf die Quellkompatibilität auswirken.

Grund für die Änderung

Im vorherigen Verhalten konnten Schnittstellenaufrufe die manuell geschriebene Validierung verwenden, während direkte Aufrufe separat generierte Überprüfungen verwendet wurden. Das Erkennen expliziter Implementierungen verhindert, dass die generierte Überprüfung unbemerkt umgangen wird, und entfernt diese divergierenden Überprüfungspfade. Weitere Informationen finden Sie unter dotnet/runtime#130263.

Wählen Sie einen Besitzer für die synchrone Validate Implementierung aus.

Um die quellgenerierte Überprüfung zu verwenden, behalten Sie [OptionsValidator] bei und entfernen die handschriftliche explizite Implementierung:

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

Um die Validierung manuell selbst zu übernehmen, entfernen Sie [OptionsValidator] und implementieren Sie den vollständigen Validator selbst:

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

Es gibt keinen Kompatibilitätsschalter. Das Unterdrücken von SYSLIB1205 behebt die widersprüchliche Zuständigkeit der Methode nicht.

Betroffene APIs