Generator sprawdzania poprawności opcji zgłasza SYSLIB1205 dla jawnych implementacji Validate

Począwszy od .NET 11 RC 1, generator źródeł weryfikacji opcji rozpoznaje jawną implementację IValidateOptions<TOptions>.Validate jako implementację odręczną. Zgłasza diagnostykę błędu SYSLIB1205 zamiast generować oddzielną publiczną metodę synchroniczną Validate.

Wersja wprowadzona

.NET 11 RC 1

Poprzednie zachowanie

Wcześniej generator źródła nie rozpoznał jawnej implementacji Validate(String, TOptions) jako istniejącej implementacji. Może wygenerować dodatkową metodę publiczną Validate, więc wywołania interfejsu używały ręcznie napisanej implementacji, podczas gdy wywołania bezpośrednie konkretnego walidatora używały wygenerowanej metody. Dwie ścieżki wywołań mogą generować różne wyniki walidacji.

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

Nowe zachowanie

Począwszy od .NET 11, generator źródła rozpoznaje jawną implementację, raportuje SYSLIB1205 i pomija synchroniczne Validate generowanie dla tego modelu opcji.

Jeśli moduł sprawdzania poprawności implementuje IAsyncValidateOptions<TOptions>również , synchroniczne i asynchroniczne generowanie pozostanie niezależne. Implementacja synchroniczna odręczna generuje SYSLIB1205 i pomija wygenerowane elementy Validate, ale generator nadal może emitować ValidateAsync.

Typ zmiany przełamującej

Ta zmiana może mieć wpływ na zgodność źródła.

Przyczyna zmiany

Poprzednie zachowanie zezwalało wywołaniom interfejsu na korzystanie z ręcznej walidacji, podczas gdy wywołania bezpośrednie używały oddzielnie wygenerowanej walidacji. Rozpoznawanie jawnych implementacji uniemożliwia niezauważalne obchodzenie wygenerowanej weryfikacji i usuwa te rozbieżne ścieżki weryfikacji. Aby uzyskać więcej informacji, zobacz dotnet/runtime#130263.

Wybierz jednego właściciela dla implementacji synchronicznej Validate .

Aby użyć weryfikacji wygenerowanej przez źródło, zachowaj [OptionsValidator] i usuń implementację jawną odręczną:

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

Aby samodzielnie obsłużyć walidację, usuń [OptionsValidator] i samodzielnie zaimplementuj kompletny walidator:

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

Brak przełącznika zgodności. Wyłączenie SYSLIB1205 nie rozwiązuje konfliktu własności metody.

Interfejsy API, których dotyczy problem