オプション検証ジェネレーターは、明示的な Validate 実装に対して SYSLIB1205 を報告します

.NET 11 RC 1 以降では、オプション検証ソース ジェネレーターは、IValidateOptions<TOptions>.Validate の明示的な実装を手書きの実装として認識します。 別のパブリック同期SYSLIB1205 メソッドを生成するのではなく、エラー診断Validateを報告します。

導入されたバージョン

.NET 11 RC 1

以前の動作

以前は、ソース ジェネレーターは、 Validate(String, TOptions) の明示的な実装を既存の実装として認識していませんでした。 追加のパブリック Validate メソッドを生成できるため、インターフェイス呼び出しでは手書きの実装が使用され、具象バリデーターの直接呼び出しでは生成されたメソッドが使用されました。 2 つの呼び出しパスによって、異なる検証結果が生成される可能性があります。

[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 実装の所有者を 1 人選択します。

ソース生成検証を使用するには、[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