從 .NET 8 開始,會默默跳過數值無法轉換成目標型別的陣列和清單元素。 過去,失敗的元素會被保留為 null 佔位符,所得集合的長度與組態來源中的元素數量相同。
所推出的版本
.NET 8
以前的行為
過去,當透過Get<T>(IConfiguration)或Bind(IConfiguration, Object)綁定陣列或清單屬性時,如果某個元素的值無法轉換為目標型別,則該元素會在結果中被保留為null佔位符。 集合長度與配置中的元素數量相匹配。
// Configuration source, for example, appsettings.json:
// "Items": [
// { "Name": "A", "Interval": 10 },
// { "Name": "B", "Interval": "a" } <-- invalid int
// ]
var settings = configuration.GetSection("Items").Get<MyItem[]>();
// .NET 6/7 result:
// settings.Length == 2
// settings[0] = { Name = "A", Interval = 10 }
// settings[1] = null (conversion failed, placeholder preserved)
新行為
從 .NET 8 開始,失敗型別轉換的元素會被靜默跳過。 所得的集合僅包含成功綁定的元素,且長度比組態來源的條目數短。
var settings = configuration.GetSection("Items").Get<MyItem[]>();
// .NET 8+ result:
// settings.Length == 1
// settings[0] = { Name = "A", Interval = 10 }
破壞性變更的類型
此變更為行為變更。
變更原因
在 .NET 8 中,ConfigurationBinder 的內部實作已被重構。 綁定器不再預先配置目標陣列並綁定元素(轉換失敗時即保留 null ),而是僅將成功綁定的元素收集成暫存清單,然後再實現最終陣列。
先前的行為對於像 這樣的值型態 int[]也造成問題。 對於無效的設定值,綁定器會儲存 0,這與合法的值 0無法區分。 新的行為避免了這種模糊。
建議的動作
在開發過程中,啟用ErrorOnUnknownConfiguration以立即顯示無效的配置值,而不是無聲地丟棄元素:
var settings = configuration.GetSection("Items").Get<MyItem[]>(options => options.ErrorOnUnknownConfiguration = true);從 .NET 8 開始,這個選項也會在ConfigurationBinder無法將值轉換成目標型別時拋出 。InvalidOperationException 更多資訊請參閱 ConfigurationBinder 因不匹配值而引發的例外。
修正無效的設定值。 確保你組態來源中的所有值都符合綁定模型的預期型別。
如果你的程式碼依賴於與設定來源匹配的元素數量,綁定後請驗證集合長度。
如果你需要優雅地處理不可轉換的值並保留所有陣列條目,請使用字串屬性搭配手動解析。
受影響的 API
- Microsoft.Extensions.Configuration.ConfigurationBinder.Get<T>(IConfiguration)
- Microsoft.Extensions.Configuration.ConfigurationBinder.Get<T>(IConfiguration, Action<BinderOptions>)
- Microsoft.Extensions.Configuration.ConfigurationBinder.Bind(IConfiguration, Object)
- Microsoft.Extensions.Configuration.ConfigurationBinder.Bind(IConfiguration, Object, Action<BinderOptions>)