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