從 .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 並不能解決方法所有權的衝突。