[英]C# switch expression incorrect nullability
我注意到當使用包含空檢查作為范圍表達式的switch 表達式時,arm/cases 中值的可空性狀態在 Visual Studio (16.7.6) 中沒有正確解釋。 例如:
string? value = GetSomeString();
var description = (value != null) switch
{
true when value.Length == 0 => "Empty",
true when value.Length == 1 => "Uno",
true when value.Length == 3 => "Third time's a charm",
_ => "null"
};
在這里,我希望在 switch 塊中知道value
所有實例都不為 null,給定我們正在打開的條件。 最后一個/默認情況處理空情況。 然而,Visual Studio 認為第一個實例可能為空:
我做錯了什么,這是分析器的錯誤還是其他原因?
您正在打開此條件: (value != null) ,其計算結果為 true 或 false。 盡管如此,變量值本身在 switch 表達式中仍然可以為空,因此該提示實際上是正確的。 每當(value != null) 的結果為false 時,您仍將進入 switch 主體,並且value將為 null。 總之,無論value是否為 null,都會執行 switch body。
編輯:
從頭開始,我錯了,你是對的。 value在特定條件下不會為 null,盡管它在 switch 主體中可能為 null。 你的 Visual Studio 有一些有趣的東西,這就是我得到的(我使用的是 VS 16.4.5),沒有警告:
我認為在您的簡單示例中,我們都同意一旦檢查空value
將繼續保留該值,但是編譯器或運行時都無法保證。
編寫另一個示例是相當簡單的,其中 value 的value
可以在(value != null)
被評估的時間和true when value.Length ...
語句中的任何一個true when value.Length ...
之間設置為 null。
因此發出警告,“值”在這里可能為空,有效。
string? value = default;
Parallel.For(0, 4, _ =>
{
while (true)
{
value = "Has a value";
var description = (value != null) switch
{
true when value.Length == 0 => "Empty",
true when value.Length == 1 => "Uno",
true when value.Length == 3 => "Thrid time's a charm",
_ => "null"
};
value = null;
}
});
寫這樣一個表達式的替代方法是
when value?.Length == 0 => "Empty",
when value?.Length == 1 => "Uno",
when value?.Length == 3 => "Thrid time's a charm",
或者
var description = value?.Length switch
{
0 => "Empty",
1 => "Uno",
3 => "Thrid time's a charm",
_ => "null"
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.