Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
ekspresi switch - ekspresi pencocokan pola menggunakan
Anda menggunakan switch ekspresi untuk mengevaluasi ekspresi tunggal dari daftar ekspresi kandidat berdasarkan kecocokan pola dengan ekspresi input. Untuk informasi tentang switch pernyataan yang mendukung switch-seperti semantik dalam konteks pernyataan, lihat switch bagian pernyataan dari artikel Pernyataan pemilihan .
Contoh berikut menunjukkan switch ekspresi, yang mengonversi nilai dari arah visual yang enum mewakili dalam peta online ke arah kardinal yang sesuai:
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
}
}
Contoh sebelumnya menunjukkan elemen switch dasar ekspresi:
- Ekspresi diikuti dengan
switchkata kunci. Dalam contoh sebelumnya, ini adalahdirectionparameter metode. -
Lengan
switchekspresi, dipisahkan oleh koma. Setiapswitchlengan ekspresi berisi pola, pelindung huruf besar/kecil opsional,=>token, dan ekspresi.
Pada contoh sebelumnya, switch ekspresi menggunakan pola berikut:
-
Pola konstanta: untuk menangani nilai enumerasi yang
Directionditentukan. -
Pola buang: untuk menangani nilai bilangan bulat apa pun yang tidak memiliki anggota
Directionenumerasi yang sesuai (misalnya,(Direction)10). Itu membuatswitchekspresi lengkap.
Penting
Untuk informasi tentang pola yang didukung oleh switch ekspresi dan contoh lainnya, lihat Pola.
Hasil ekspresi switch adalah nilai ekspresi lengan ekspresi pertama switch yang polanya cocok dengan ekspresi input dan pelindung kasusnya, jika ada, mengevaluasi ke true. Lengan switch ekspresi dievaluasi dalam urutan teks.
Pengkompilasi menghasilkan kesalahan ketika lengan ekspresi yang lebih rendah switch tidak dapat dipilih karena lengan ekspresi yang lebih tinggi switch cocok dengan semua nilainya.
Penjaga kasus
Pola mungkin tidak cukup ekspresif untuk menentukan kondisi untuk evaluasi ekspresi lengan. Dalam kasus seperti itu, Anda dapat menggunakan penjaga kasus.
Penjaga kasus adalah kondisi lain yang harus dipenuhi bersama dengan pola yang cocok. Penjaga kasus harus berupa ekspresi Boolean. Anda menentukan penjaga kasus setelah when kata kunci yang mengikuti pola, seperti yang ditunjukkan contoh berikut:
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),
};
Contoh sebelumnya menggunakan pola properti dengan pola var berlapis.
Ekspresi sakelar yang tidak lengkap
Jika tidak ada pola ekspresi yang switch cocok dengan nilai input, runtime akan menampilkan pengecualian. Dalam .NET Core 3.0 dan versi yang lebih baru, pengecualiannya adalah System.Runtime.CompilerServices.SwitchExpressionException. Dalam .NET Framework, pengecualiannya adalah InvalidOperationException. Dalam kebanyakan kasus, pengkompilasi menghasilkan peringatan jika switch ekspresi tidak menangani semua kemungkinan nilai input.
Pola daftar tidak menghasilkan peringatan ketika semua input yang mungkin tidak ditangani.
Tip
Untuk menjamin bahwa switch ekspresi menangani semua nilai input yang mungkin, berikan switch lengan ekspresi dengan pola buang.
Spesifikasi bahasa C#
Untuk informasi selengkapnya, lihat bagian switch ekspresispesifikasi bahasa C#.