switch 運算式 (c # 參考)

從 c # 8.0 開始,您可以使用 switch 運算式,根據具有輸入運算式的模式比對,從候選運算式清單中評估單一運算式。 如 switch switch 需語句內容中支援 like 語義之語句的詳細資訊,請參閱 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 運算式臂(以逗號分隔)。 每個 switch 運算式 arm 都包含一個 模式,也就是選擇性的 案例防護=> token 和 運算式

在上述範例中, switch 運算式會使用下列模式:

  • 常數模式,用來處理已定義的 Direction 列舉值。
  • 捨棄模式,用來處理任何沒有列舉對應成員的整數值 Direction (例如 (Direction)10) 。 這會讓 switch 運算式 詳盡

如需運算式所支援之模式的詳細資訊 switch ,請參閱 模式

運算式的結果 switch 是第一個運算式 arm 運算式的值, switch 其模式符合輸入運算式,而其臨界值成立(如果有的話)會評估為 trueswitch運算式臂會以文字順序進行評估。

因為較高的運算式 switch switch arm 符合其所有值,所以無法選擇較低的運算式 arm 時,編譯器會產生錯誤。

案例防護

模式可能沒有足夠的表達方式可指定用於評估 arm 運算式的條件。 在這種情況下,您可以使用案例防護。 這是必須搭配相符模式一起滿足的額外條件。 您可以在採用模式的關鍵字之後指定 case 防護 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),
};

上述範例會使用具有嵌套var 模式屬性模式

非徹底的 switch 運算式

如果 switch 運算式的模式都不符合輸入值,執行時間會擲回例外狀況。 在 .NET Core 3.0 和更新版本中,例外狀況為 System.Runtime.CompilerServices.SwitchExpressionException 。 在 .NET Framework 中,例外狀況為 InvalidOperationException 。 如果 switch 運算式未處理所有可能的輸入值,則編譯器會產生警告。

提示

若要保證 switch 運算式可處理所有可能的輸入值,請提供 switch 具有 捨棄模式的運算式 arm。

C# 語言規格

如需詳細資訊,請參閱功能提案備註的「 switch 運算式」一節。

另請參閱