switch 運算式:使用 switch
關鍵字模式比對運算式
您可以使用 switch
運算式,根據與輸入運算式的模式比對,從候選運算式清單中評估單一運算式。 如需 switch
陳述式內容中支援 switch
類似語意的語句相關資訊,請參閱 Selection 陳述式一文的switch
陳述式一節。
下列範例示範 switch
運算式,它會將線上地圖中代表視覺方向的 enum
值轉換為對應的基數方向:
public static class SwitchExample
{
public enum Direction
{
Up,
Down,
Right,
Left
}
public enum Orientation
{
North,
South,
East,
West
}
public static Orientation ToOrientation(Direction direction) => direction switch
{
Direction.Up => Orientation.North,
Direction.Right => Orientation.East,
Direction.Down => Orientation.South,
Direction.Left => Orientation.West,
_ => throw new ArgumentOutOfRangeException(nameof(direction), $"Not expected direction value: {direction}"),
};
public static void Main()
{
var direction = Direction.Right;
Console.WriteLine($"Map view direction is {direction}");
Console.WriteLine($"Cardinal orientation is {ToOrientation(direction)}");
// Output:
// Map view direction is Right
// Cardinal orientation is East
}
}
上述範例顯示 switch
運算式的基本元素:
- 後面接著
switch
關鍵字的運算式。 在上述範例中,它是direction
方法參數。 switch
運算式 arms,以逗號分隔。 每個switch
運算式 arm 包含模式、選擇性案例成立條件、=>
權杖和運算式。
在上述範例中,switch
運算式會使用下列模式:
switch
運算式的結果是第一個 switch
運算式 arm 的運算式值,其模式符合輸入運算式,而且如果案例成立條件存在的話,則會評估為 true
。 switch
運算式 arms 會以文字順序進行評估。
無法選擇較低的 switch
運算式 arm 時,編譯器會產生錯誤,因為較高的 switch
運算式 arm 符合其所有值。
案例成立條件
模式可能沒有足夠的表達力指定評估 arm 運算式的條件。 在此情況下,您可以使用案例成立條件。 案例成立條件是必須與相符模式一起滿足的另一個條件。 案例成立條件必須是布林運算式。 您可以在跟隨模式後的 when
關鍵字後指定案例成立條件,如下列範例所示:
public readonly struct Point
{
public Point(int x, int y) => (X, Y) = (x, y);
public int X { get; }
public int Y { get; }
}
static Point Transform(Point point) => point switch
{
{ X: 0, Y: 0 } => new Point(0, 0),
{ X: var x, Y: var y } when x < y => new Point(x + y, y),
{ X: var x, Y: var y } when x > y => new Point(x - y, y),
{ X: var x, Y: var y } => new Point(2 * x, 2 * y),
};
不完整的switch運算式
如果 switch
運算式的模式均不符合輸入值,執行階段會擲回例外狀況。 在 .NET Core 3.0 和更新版本中,例外狀況是 System.Runtime.CompilerServices.SwitchExpressionException。 在 .NET Framework 中,例外狀況是 InvalidOperationException。 在大部分情況下,如果 switch
運算式未處理所有可能的輸入值,編譯器就會產生警告。 未處理所有可能輸入時,清單模式不會產生警告。
提示
若要保證 switch
運算式會處理所有可能的輸入值,請提供具有捨棄模式的 switch
運算式 arm。
C# 語言規格
如需詳細資訊,請參閱功能提案附註的 switch
運算式一節。