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 is com 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

  1. Declaramos object valor = 3.14; para simular um valor de tipo desconhecido em tempo de compilação.
  2. O primeiro if testa valor is int i. Como 3.14 é double, a condição é falsa e o bloco é ignorado.
  3. O segundo else if testa valor is string s. Também é falso.
  4. O terceiro else if testa valor is double d. É verdadeiro, então d recebe 3.14.
  5. Dentro do bloco, usamos d diretamente na interpolação de string.
  6. Se nenhum tipo correspondesse, o else imprimiria "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. Use is double d para capturar.
  • Ordem errada dos testes: se você testar object antes de tipos específicos, o primeiro if sempre será verdadeiro. Sempre teste tipos mais específicos primeiro.
  • Usar as em vez de is: var d = valor as double; não funciona para tipos de valor (double), pois as só 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