簡體   English   中英

C# switch 表達式不正確的可空性

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM