Generátor ověřování možností hlásí SYSLIB1205 pro explicitní implementace ověření

Počínaje verzí .NET 11 RC 1 rozpozná generátor zdrojového kódu pro ověřování možností explicitní implementaci IValidateOptions<TOptions>.Validate jako ručně psanou implementaci. Hlásí diagnostiku chyby SYSLIB1205 namísto vygenerování samostatné veřejné synchronizované Validate metody.

Verze byla představena

.NET 11 RC 1

Předchozí chování

Dříve generátor zdrojů nerozpoznával explicitní implementaci Validate(String, TOptions) jako existující implementaci. Může vygenerovat další veřejnou Validate metodu, takže volání rozhraní používala ručně psanou implementaci, zatímco přímá volání konkrétního validátoru používala vygenerovanou metodu. Dvě cesty volání můžou vést k různým výsledkům ověření.

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

Nové chování

Počínaje .NET 11 rozpozná generátor zdrojů explicitní implementaci, nahlásí SYSLIB1205 a potlačí synchronní generování Validate pro daný model možností.

Pokud validátor také implementuje IAsyncValidateOptions<TOptions>, synchronní a asynchronní generování zůstává nezávislé. Ručně psaná synchronní implementace vytváří SYSLIB1205 a potlačuje generované Validate, ale generátor může stále generovat ValidateAsync.

Typ zásadní změny

Tato změna může mít vliv na kompatibilitu zdroje.

Důvod změny

Předchozí chování umožňovalo, aby volání rozhraní používala ručně psané ověřování, zatímco přímá volání používala samostatně generované ověřování. Rozpoznávání explicitních implementací zabraňuje tichému obejití vygenerovaného ověření a odstraňuje tyto odlišné cesty ověřování. Další informace najdete v tématu dotnet/runtime#130263.

Zvolte jednoho vlastníka pro implementaci Validate, která je synchronní.

Pokud chcete použít ověřování generované zdrojem, ponechte [OptionsValidator] a odeberte rukou psanou explicitní implementaci:

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

Chcete-li si validaci zajišťovat ručně, odeberte [OptionsValidator] a implementujte kompletní validátor sami:

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

Neexistuje žádný přepínač kompatibility. Potlačení SYSLIB1205 nevyřeší konfliktní vlastnictví metody.

Ovlivněná rozhraní API