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
式は次のパターンを使用します。
-
定数パターン:
Direction
列挙体の定義された値を処理します。 -
破棄パターン:
Direction
列挙体の対応するメンバーを持たない整数値 (たとえば、(Direction)10
) を処理します。 これにより、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
式」セクションを参照してください。
こちらも参照ください
.NET