Para fazermos escolhas na linguagem C# , usamos o comando switch que irá comparar um valor a um grupo de outros valores e executar um trecho caso o retorno da comparação seja verdadeira.

O comando de escolha bem como o seu funcionamento já foi discutidos em Portugol: Comandos de Escolha e Tutorial C: Comando > switch sendo a leitura recomendada.

Os operadores relacionais e lógicos que podem ser utilizados como switch podem ser vistos em com exemplos C# : Operadores.

Para fazermos escolhas da linguagem de programação C#, utilizamos o comando switch que possui sua sintaxe apresentada abaixo. O comando switch utiliza o comando break como parte de sua sintaxe.

Fig. 1: Comando switch
Sintaxe
switch(condicao)
{
	case caso1: 
	        //seu codigo aqui
	break;
	case caso2: 
	        //seu codigo aqui
	break;
	default:
	        //seu codigo aqui
	break;
}
Onde
condicao: valor numérico, string, char, retorno de método ou expressão

O caso default é opcional. Com esse caso, podemos executar algum trecho de código caso o valor não seja igual a algum dos valores da cláusula case. Por boa prática, é bom mantê-lo para identificação de possíveis erros.

Exemplo 1
using System;

public class Program
{
	public static void Main()
	{
		int valor = 1;

		switch(valor)
		{
			case 0:
				Console.WriteLine(0);
			break;
			case 1:
				Console.WriteLine(1);
			break;

			default: Console.WriteLine("Opcao invalida");
		}
	}
}
Saída
1

A linguagem C# permite também que strings sejam utilizandos nos cases do comando switch, não limitando-se apenas aos tipos inteiros.

Exemplo 2
using System;

public class Program
{
	public static void Main()
	{
		string str = "cmd";
		switch(str)
		{
			case "cmd":
				Console.WriteLine("cmd");
				break;
			default: //omitido
				break;            
		}
	}
}
Saída
cmd

A linguagem C#, assim como C/C++, permite que o switch tenha membros de enumeradores em seus cases. O tipo de dado enum pode ser visto em C#: Enum com mais informações.

Exemplo 3
using System;
public class Program
{
	enum Enumerador 
	{
		Zero,
		Um,
		Dois,
		Tres
	}
	
	public static void Main()
	{
		Enumerador enm = Enumerador.Zero;

		switch(enm)
		{
			case Enumerador.Zero:
				Console.WriteLine(enm);
			break;
			default://omitido
			break;
		}
	}
}
Saída
Zero

Para a execução de um mesmo trecho de código para mais de um case, basta adicionar as cláusulas case em sequência ou "um abaixo do outro" sendo separados por (:).

Exemplo 4
int valor = 1;
        
switch(valor)
{
    case 0:
    case 1:
        Console.WriteLine(1);
    break;
    //default omitido
}
Saída
1

C# possui os comandos when e is que podem ser utilizados em conjunto com o comando switch para checar o tipo de dado de um valor no case, como mostrado na sintaxe logo abaixo:

Sintaxe
case tipo_dado nome_varialvel when nome_variavel is valor_comparacao 
Onde
-
Exemplo 4
enum Enumerador {
    Zero,
    Um,
    Dois,
    Tres
}
Enumerador enm = Enumerador.Zero;
        
switch(enm)
{
    case Enumerador e when e is Enumerador.Zero: 
        Console.WriteLine(e);
    break;
    default:
    break;
}
Saída
Zero

O comando when permite que expressões relacionais ou lógicas possam ser utilizadas nos cases do comando switch como pode ser visto nos exemplos abaixo:

Exemplo 5
using System;
public class Program
{
	enum Enumerador 
	{
			Zero,
			Um,
			Dois,
			Tres
	}
	
	public static void Main()
	{
		Enumerador enm = Enumerador.Zero;

		switch(enm)
		{
			case Enumerador e when (e == Enumerador.Zero || e == Enumerador.Um): 
				Console.WriteLine(e);
			break;
			default:
			break;
		}
	}
}
Saída
Zero
Exemplo 6
using System;
public class Program
{
	public static void Main()
	{
		int a = 10;
		switch(a)
		{
			case int val when (val >= 5): 
				Console.WriteLine(a);
			break;
			default:
			break;
		}
	}
}
Saída
10

Os cases do comando switch podem conter expressões contendo os operadores lógicos and, or e not criando assim um intervalo de dados específico. Abaixo um exemplo que ilustra o que foi explicado:

Exemplo 7: and com intervalo
using System;

class HelloWorld
{
  static void Main() 
  {
	int valor_teste = 1;
	 
	switch(valor_teste)
	{
		case > 0 and < 3 : Console.WriteLine("> 0 and < 3 "); break;
		case < 0 and > -3: Console.WriteLine("<< 0 and > -3"); break;
	}
	  
	switch(valor_teste)
	{
		case 0 or 1 : Console.WriteLine("0 or 1"); break;
		case 2 or 3: Console.WriteLine("2 or 3"); break;
	}
  }
}
Saída
< 0 and > -3
Exemplo 8: when com intervalo
using System;
public class Program
{
	public static void Main()
	{
		int a = 10;
		switch(a)
		{
			case int val when (val >= 5): 
				Console.WriteLine(a);
			break;
			default:
			break;
		}
	}
}
Saída
10

Na expressão contendo and ou or também é possível utilizar os tipos string, char e enums como os valores para teste:

Exemplo 9: intervalo com char
using System;

public enum Test{A,B,C,D}

class HelloWorld
{
  static void Main() 
  {
	char valor_teste = 'b';
	 
	switch(valor_teste)
	{
		case > 'a' and < 'c': Console.WriteLine("> a"); break;
		case > 'd': Console.WriteLine("> d"); break;
	}
	 
	string str = "c#";
	  
	switch(str)
	{
		case "c#" or "c++": Console.WriteLine("c# or c++"); break;
		case "java"or "kotlin": Console.WriteLine("java or kotlin"); break;
	}
	  
	Test tst = Test.A;
	
	switch(tst)
	{
		case Test.A or Test.B: Console.WriteLine("Test.A or Test.B"); break;
		case Test.C or Test.D: Console.WriteLine("Test.C or Test.D"); break;
	}
  }
}
Saída
> a
c# or c++
Test.A or Test.B

A partir de C# 8, uma nova sintaxe para o comando switch foi adicionada: Switch Expression. A sintaxe é semelhante ao padrão match disponível em outras linguagens.

Sintaxe
tipo_dado nome_variavel = expressao_teste switch {
    <valor_testado1> => expressao1,
    <valor_testado2> => expressao2,
    <valor_testadoN> => expressaoN,
        _ => expressao_default
}; 

Nessa nova sintaxe, podemos atribuir um valor de retorno do comando sem a necessidade de atribuição interna em cada caso, uso de break ou retorno de para método.

Exemplo 10
using System;

class HelloWorld
{
  static void Main() 
  {
	int valor_teste = 1;
	 
	int ret = valor_teste switch 
	{
			1 => valor_teste*1,
			2 => valor_teste*2,
			3 => valor_teste*3,
			_ => -1
	};
	  
	Console.WriteLine($"{ret}");
  }
}
Saída
1

Com Switch Expression, também é possível utilizar os tipos string, char e enums como os valores para teste. Além disso, as expressões utilizando (>, <, <=, >=) e (and, or e not) podem ser utilizadas também:

Exemplo 11
using System;

public enum Test{ A, B, C, D}

class HelloWorld
{
  static void Main() 
  {
	char valor_teste = 'b';
	 
	var res1 =  valor_teste switch
	{
		> 'a' and < 'c' =>  "> \'a\' and < \'c\'",
		> 'd' => "> d",
		_ => String.Empty
	};
	Console.WriteLine($"{res1}");
	string str = "c#";
	  
	var res2 = str switch
	{
		"c#" or "c++" => "\"c#\" or \"c++\"",
		"java"or "kotlin" => "java or kotlin",
		_ => String.Empty
	};
	Console.WriteLine($"{res2}");
	
	Test tst = Test.A;
	
	var res3 = tst switch
	{
		Test.A or Test.B => "Test.A or Test.B",
		Test.C or Test.D =>"Test.C or Test.D",
		_ => String.Empty
	};
	Console.WriteLine($"{res3}");
  }
}
Saída
> 'a' and < 'c'
"c#" or "c++"
Test.A or Test.B
  1. 16/06/2026 - revisão 3 - Adição: 'Switch e case com and ou or' e 'switch expression'
  2. 05/08/2025 - revisão 2 - Ajustes: pontuais, 'objetivos', link 'Operadores' e sintaxes
  3. 14/10/2024 - revisão 1 - Correção: links portugol, exemplos; Ajustes pontuais
  4. 06/03/2024 - versão inicial