簡體   English   中英

落在模式匹配中

[英]Fall through in pattern matching

目前在c#7(版本15.3.4)中,以下代碼對編譯有效,但兩個變量都是合法不可用的。

switch(fruit)
{
    case Apple apple:
    case Orange orange:
    // impossible to use apple or orange
    break;
    case Banana banana:
    break;
}

如果您嘗試使用它們,則會得到熟悉的錯誤,在訪問之前可能無法初始化變量。

有時在模式匹配中,您不關心確切的類型,只要該類型屬於您想要的類別。 這里只以蘋果和橘子為例。

List<Fruit> applesAndOranges = new List<Fruit>();
switch(fruit)
{
    case Fruit X when X is Apple || X is Orange:
    applesAndOranges.Add(X);
    break;
    case Banana banana:
    break;
}

有更好的方法嗎?

如果您不想在當前區域中創建垃圾局部變量,則可以使用丟棄。 那么你可以直接使用開關變量。 如果切換變量是像對象或其他類似的超類,則可能需要額外的強制轉換。

List<Fruit> applesAndOranges = new List<Fruit>();
switch(fruit)
{
    case Apple _:
    case Orange _:
    applesAndOranges.Add(fruit);
    break;
    case Banana banana:
    break;
}

我不知道如何編譯模式匹配。 如果它使用跳轉表,那么這種方法也可以更快一些。 雖然表現不是我關注的問題。 這更具可讀性。

我已經對這兩種解決方案感到滿意,所以這是我喜歡分享的問答帖子。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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