Inferência de tipo

Inferência de tipo e a palavra-chave var

Analise o código abaixo. O tipo informado no início da declaração da variável pode ser deduzido automaticamente pelo compilador por meio do conteúdo de inicialização à direita do sinal de igual. Por exemplo, será que o número 18 pode ser identificado como inteiro int, e Phone() ser deduzido como o tipo Phone?

static void Main( )
{
    int age = 18; // O valor 18 à direita é diretamente inferido como int
    Phone p = new Phone(); // O construtor da direita retorna um objeto Phone
}
Code language: C# (cs)

Sendo assim, o código acima pode ser simplificado?

O C# disponibiliza a palavra-chave var para simplificar a escrita, substituindo a declaração explícita de tipo.

static void Main( )
{
    var age = 18;
    var p = new Phone();
}
Code language: JavaScript (javascript)

No código acima, todas as variáveis à esquerda utilizam var. O compilador identifica o tipo com base na expressão da direita. Após a compilação, esses dois trechos de código são idênticos.

Observações

  1. var não é um tipo dinâmico, é apenas uma abreviação sintática. O compilador define o tipo deduzido no momento da compilação, e esse tipo não pode ser alterado posteriormente; os dois códigos têm o mesmo significado.
  2. Restrições obrigatórias ao usar var:
    • Só pode ser usado em variáveis locais, não em campos de classe
    • É obrigatório definir um valor inicial na declaração, não é válido escrever apenas var x;
    • O tipo após a inferência é fixo, não é possível armazenar dados de outro tipo na variável depois
  3. Diferença importante: var no C# ≠ var no JavaScript. O var do JavaScript usa tipagem fraca e dinâmica, permitindo que uma variável armazene tipos diferentes a qualquer momento. O var do C# é apenas uma abreviação para tipagem estática forte e não altera as características da linguagem C#.

Ou seja, durante a compilação, o compilador analisa o lado direito e define o tipo de age como int e o tipo de p como Phone. O resultado final é igual ao primeiro trecho de código.

Não é possível alterar os tipos depois. Veja o exemplo:

class Program
{
    static void Main()
    {
        var age = 18;
        age = 3.14;
        var p = new Phone();
    }
}

class Phone
{
    public string Name { get; set; }
}Code language: C# (cs)

Essa forma de escrita causa erro no C#, mas é permitida em outras linguagens como JavaScript e PHP, que aceitam mudar o tipo da variável.

JavaScript e PHP são linguagens de tipagem fraca e dinâmica, sem restrições de tipo fixo para variáveis.

Exemplo incorreto


class Program
{
    static void Main()
    {
        var age = 18;
        age = 3.14;
        var p = new Phone();

        var isBuy;
    }
}

class Phone
{
    var price = 1000;
    var model = "iPhone";

    int count = 12;
}Code language: C# (cs)

Inferência de tipo

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *