Le générateur de validation des options signale SYSLIB1205 pour les implémentations Validate explicites

À partir de .NET 11 RC 1, le générateur de source de validation d’options reconnaît une implémentation explicite de IValidateOptions<TOptions>.Validate comme une implémentation manuscrite. Il signale le diagnostic SYSLIB1205 d’erreur au lieu de générer une méthode synchrone Validate publique distincte.

Version introduite

.NET 11 RC 1

Comportement antérieur

Auparavant, le générateur source ne reconnaissait pas une implémentation explicite de Validate(String, TOptions) comme une implémentation existante. Elle pourrait générer une méthode publique Validate supplémentaire, de sorte que les appels d’interface utiliseraient l’implémentation manuscrite, tandis que les appels directs sur le validateur concret utiliseraient la méthode générée. Les deux chemins d’accès d’appel peuvent produire des résultats de validation différents.

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

Nouveau comportement

À compter de .NET 11, le générateur source reconnaît l’implémentation explicite, signale SYSLIB1205 et supprime la génération Validate synchrone pour ce modèle d’options.

Si le validateur implémente également IAsyncValidateOptions<TOptions>, la génération synchrone et asynchrone restent indépendantes. L’implémentation synchrone manuscrite produit SYSLIB1205 et supprime le Validate généré, mais le générateur peut toujours émettre ValidateAsync.

Type de changement avec rupture de compatibilité

Cette modification peut affecter la compatibilité de la source.

Raison du changement

Le comportement précédent a autorisé les appels d’interface à utiliser la validation codée à la main tandis que les appels directs ont utilisé la validation générée séparément. La reconnaissance des implémentations explicites empêche la validation générée d’être ignorée en mode silencieux et supprime ces chemins de validation divergents. Pour plus d’informations, consultez dotnet/runtime#130263.

Choisissez un seul propriétaire pour l’implémentation synchrone Validate.

Pour utiliser la validation générée par la source, conservez [OptionsValidator] et supprimez l’implémentation explicite manuscrite :

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

Pour gérer vous-même la validation, supprimez [OptionsValidator] et implémentez vous-même le validateur complet :

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

Il n’existe aucune option de compatibilité. La suppression de SYSLIB1205 ne résout pas la propriété conflictuelle de la méthode.

API affectées