Генератор проверки параметров конфигурации сообщает о SYSLIB1205 для явных реализаций Validate

Начиная с .NET 11 RC 1, генератор источников проверки параметров распознает явную реализацию IValidateOptions<TOptions>.Validate как рукописную реализацию. Он сообщает диагностическое сообщение об ошибке SYSLIB1205 вместо создания отдельного общедоступного синхронного метода Validate.

Представленная версия

.NET 11 RC 1

Предыдущее поведение

Ранее генератор источника не распознал явную реализацию Validate(String, TOptions) как существующую реализацию. Он может создать дополнительный открытый Validate метод, поэтому вызовы интерфейса использовали рукописную реализацию, а прямые вызовы конкретного валидатора — созданный метод. Два пути вызова могут создавать различные результаты проверки.

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

Новое поведение

Начиная с .NET 11, генератор источника распознает явную реализацию, сообщает о SYSLIB1205 и подавляет синхронное Validate поколение для этой модели параметров.

Если валидатор также реализует IAsyncValidateOptions<TOptions>, синхронная и асинхронная генерация остаются независимыми. Рукописная синхронная реализация создает SYSLIB1205 и подавляет созданные Validate, но генератор по-прежнему может выдавать ValidateAsync.

Тип разрушающего изменения

Это изменение может повлиять на совместимость исходного кода .

Причина изменения

Предыдущее поведение позволяло вызовам интерфейса использовать написанную вручную проверку, тогда как прямые вызовы использовали отдельно сгенерированную проверку. Распознавание явных реализаций препятствует незаметному обходу созданной проверки и устраняет эти расходящиеся пути проверки. Дополнительные сведения см. в статье dotnet/runtime#130263.

Выберите одного владельца для синхронной Validate реализации.

Чтобы использовать проверку, созданную источником, сохраните [OptionsValidator] и удалите явную реализацию, написанную вручную:

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

Чтобы самостоятельно управлять проверкой, удалите [OptionsValidator] и реализуйте полный валидатор самостоятельно:

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

Нет переключателя совместимости. Подавление SYSLIB1205 не устраняет конфликт прав владения методом.

Затронутые API