次の方法で共有


switch 式 - switch キーワードを使用したパターン マッチング式

switch式を使用して、入力式とのパターン一致に基づいて候補式のリストから単一の式を評価します。 ステートメント コンテキストでswitchのようなセマンティクスをサポートするswitch ステートメントについては、Selection ステートメントに関する記事のswitch ステートメント」セクションを参照してください。

次の例では、オンライン マップ内の視覚的な方向を表すenumの値を対応するカーディナル方向に変換するswitch式を示します。

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 式アームには、 パターン、省略可能な ケース ガード=> トークン、および式が含 まれています

前の例では、 switch 式は次のパターンを使用します。

Von Bedeutung

switch式でサポートされるパターンとその他の例については、「パターン」を参照してください。

switch式の結果は、パターンが入力式と一致し、ケース ガード (存在する場合) がtrueに評価される最初のswitch式アームの式の値です。 switch式のアームは、テキストの順序で評価されます。

上位のswitch式アームがそのすべての値と一致するため、より低いswitch式アームを選択できない場合、コンパイラはエラーを生成します。

ケースガード

パターンは、腕の式の評価の条件を指定するのに十分な表現力がない可能性があります。 このような場合は、 ケース ガードを使用できます。 ケース ガードは、一致するパターンと一緒に満たす必要があるもう 1 つの条件です。 ケース ガードはブール式である必要があります。 次の例に示すように、パターンに従う 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式のパターンのいずれも入力値と一致しない場合、ランタイムは例外をスローします。 .NET Core 3.0 以降のバージョンでは、例外は System.Runtime.CompilerServices.SwitchExpressionExceptionです。 .NET Framework では、例外は InvalidOperationExceptionです。 ほとんどの場合、 switch 式が可能なすべての入力値を処理しない場合、コンパイラは警告を生成します。 可能なすべての入力が処理されない場合、リスト パターンでは警告は生成されません。

ヒント

switch式が可能なすべての入力値を処理することを保証するには、破棄パターンを持つswitch式アームを指定します。

C# 言語仕様

詳細については、機能提案ノートswitch」セクションを参照してください。

こちらも参照ください