Fácil C#
Verificando tipos com is
Enunciado
Crie um programa que receba um object e use type patterns para verificar se é int, string ou double. Imprima uma mensagem diferente para cada tipo, mostrando o valor capturado.
Requisitos
- Use
iscom type pattern para cada verificação. - Capture o valor em uma variável e use-a na mensagem.
- Imprima uma mensagem padrão se nenhum tipo corresponder.
- O programa deve compilar e rodar sem erros.
Código inicial
using System;
public class Program
{
public static void Main()
{
object valor = 3.14;
// Seu código aqui
}
}
Saída esperada
É um double: 3.14
Ver dica
Use if (valor is int i), depois else if (valor is string s) e assim por diante.
Mostrar solução
using System;
public class Program
{
public static void Main()
{
object valor = 3.14;
// Type pattern para int
if (valor is int i)
{
Console.WriteLine($"É um int: {i}");
}
// Type pattern para string
else if (valor is string s)
{
Console.WriteLine($"É uma string: {s}");
}
// Type pattern para double
else if (valor is double d)
{
Console.WriteLine($"É um double: {d}");
}
else
{
Console.WriteLine("Tipo desconhecido");
}
}
}
Passo a passo
- Declaramos
object valor = 3.14;para simular um valor de tipo desconhecido em tempo de compilação. - O primeiro
iftestavalor is int i. Como3.14édouble, a condição é falsa e o bloco é ignorado. - O segundo
else iftestavalor is string s. Também é falso. - O terceiro
else iftestavalor is double d. É verdadeiro, entãodrecebe3.14. - Dentro do bloco, usamos
ddiretamente na interpolação de string. - Se nenhum tipo correspondesse, o
elseimprimiria "Tipo desconhecido".
Por que funciona
O type pattern verifica o tipo em tempo de execução e, se a correspondência for bem-sucedida, declara uma variável já tipada com o valor convertido. Isso elimina a necessidade de fazer cast manual ((double)valor) e evita exceções de conversão inválida.
Erros comuns
- Esquecer a variável de captura:
if (valor is double)compila, mas você não tem acesso ao valor convertido. Useis double dpara capturar. - Ordem errada dos testes: se você testar
objectantes de tipos específicos, o primeiroifsempre será verdadeiro. Sempre teste tipos mais específicos primeiro. - Usar
asem vez deis:var d = valor as double;não funciona para tipos de valor (double), poisassó aceita tipos de referência ou anuláveis.
Outra forma de resolver
Usar switch com type patterns:
switch (valor)
{
case int i: Console.WriteLine($"É um int: {i}"); break;
case string s: Console.WriteLine($"É uma string: {s}"); break;
case double d: Console.WriteLine($"É um double: {d}"); break;
default: Console.WriteLine("Tipo desconhecido"); break;
}
Essa forma é preferível quando há muitos tipos para testar.
Saída esperada
É um double: 3.14