Instrução Option Infer

Permite o uso de inferência de tipo local ao declarar variáveis.

Sintaxe

Option Infer { On | Off }

Partes

Termo Definição
On Opcional. Permite inferência de tipo local.
Off Opcional. Desabilita inferência de tipo local.

Comentários

Para definir Option Infer em um arquivo, digite Option Infer On ou Option Infer Off na parte superior do arquivo, antes de qualquer outro código-fonte. Se o valor definido para Option Infer em um arquivo entrar em conflito com o valor definido no IDE ou na linha de comando, o valor no arquivo possui precedência.

Quando você define Option Infer para On, você pode declarar variáveis locais sem especificar explicitamente um tipo de dados. O compilador infere o tipo de dados de uma variável do tipo de sua expressão de inicialização.

Na ilustração a seguir, Option Infer está ativado. A variável na declaração Dim someVar = 2 é declarada como um inteiro por inferência de tipo.

A captura de tela a seguir mostra o IntelliSense quando a instrução Option Infer está ativada:

Screenshot showing IntelliSense view when Option Infer is on.

Na ilustração a seguir, o Option Infer está desativado. A variável na declaração Dim someVar = 2 é declarada como um Object por inferência de tipo. Neste exemplo, a configuração de Option Strict está definida como Desativada em Compilar Página, Designer de Projeto (Visual Basic).

A captura de tela a seguir mostra o IntelliSense quando a instrução Option Infer está desativada:

Screenshot showing IntelliSense view when Option Infer is off.

Observação

Quando uma variável é declarada como um Object, o tipo de tempo de execução pode ser alterado enquanto o programa está sendo executado. O Visual Basic executa operações denominadas boxing e unboxing para converter entre um Object e um tipo de valor, o que torna a execução mais lenta. Para obter informações sobre boxing e unboxing, consulte a Especificação de Linguagem do Visual Basic.

A inferência de tipo aplica-se no nível do procedimento e não fora de um procedimento em uma classe, estrutura, módulo ou interface.

Para obter mais informações, consulte Inferência de tipo local.

Quando uma Instrução Option Infer Não Está Presente

Se o código-fonte não contiver uma instruçãoOption Infer, será usada a configuração de Option Infer em Compilar Página, Designer de Projeto (Visual Basic). Se for usado o compilador de linha de comando, será usada a opção do compilador -optioninfer.

Para definir o Option Infer no IDE

  1. No Gerenciador de Soluções, selecione um projeto. No menu Projeto , clique em Propriedades.

  2. Clique na guia Compilar.

  3. Defina o valor na caixa Option infer.

Quando você cria um novo projeto, a configuração de Option Infer na guia Compilar é definida para a configuração de Option Infer na caixa de diálogo Padrões do VB. Para acessar a caixa de diálogo Padrões de VB, no menu Ferramentas, clique em Opções. Na caixa de diálogo Opções, expanda Projetos e Soluções e, em seguida, clique em Padrões de VB. A configuração inicial padrão nos Padrões de VB é On.

Para definir o Option Infer na linha de comando

Inclua a opção -optioninfer do compilador no comando vbc.

Tipos de Dados e Valores Padrão

A tabela a seguir descreve os resultados de várias combinações de especificar o tipo de dados e o inicializador em uma instrução Dim.

Tipo de dados especificado? Inicializador especificado? Exemplo Result
Não Não Dim qty Se o Option Strict estiver desativado (padrão), a variável é definida como Nothing.

Se Option Strict estiver ativado, ocorre um erro de tempo de compilação.
No Yes Dim qty = 5 Se Option Infer estiver ativado (padrão), a variável usa o tipo de dados do inicializador. Confira Inferência de tipo de variável local.

Se Option Infer estiver desativado e Option Strict estiver desativado, a variável usa o tipo de dados do Object.

Se Option Infer estiver desativado e Option Strict estiver ativado, ocorre um erro de tempo de compilação.
Sim Não Dim qty As Integer A variável é inicializada para o valor padrão para o tipo de dados. Para obter mais informações, confira Instrução Dim.
Sim Sim Dim qty As Integer = 5 Se o tipo de dados do inicializador não for conversível para o tipo de dados especificado, ocorrerá um erro de tempo de compilação.

Exemplo 1

Os exemplos a seguir demonstram como a instrução Option Infer habilita a inferência de tipo local.

' Enable Option Infer before trying these examples.

' Variable num is an Integer.
Dim num = 5

' Variable dbl is a Double.
Dim dbl = 4.113

' Variable str is a String.
Dim str = "abc"

' Variable pList is an array of Process objects.
Dim pList = Process.GetProcesses()

' Variable i is an Integer.
For i = 1 To 10
    Console.WriteLine(i)
Next

' Variable item is a string.
Dim lst As New List(Of String) From {"abc", "def", "ghi"}

For Each item In lst
    Console.WriteLine(item)
Next

' Variable namedCust is an instance of the Customer class.
Dim namedCust = New Customer With {.Name = "Blue Yonder Airlines",
                                   .City = "Snoqualmie"}

' Variable product is an instance of an anonymous type.
Dim product = New With {Key .Name = "paperclips", .Price = 1.29}

' If customers is a collection of Customer objects in the following 
' query, the inferred type of cust is Customer, and the inferred type
' of custs is IEnumerable(Of Customer).
Dim custs = From cust In customers 
            Where cust.City = "Seattle" 
            Select cust.Name, cust.ID

Exemplo 2

O exemplo a seguir demonstra o tipo de tempo de execução pode ser diferente quando uma variável é identificada como um Object.

' Disable Option Infer when trying this example.

Dim someVar = 5
Console.WriteLine(someVar.GetType.ToString)

' If Option Infer is instead enabled, the following
' statement causes a run-time error. This is because
' someVar was implicitly defined as an integer.
someVar = "abc"
Console.WriteLine(someVar.GetType.ToString)

' Output:
'  System.Int32
'  System.String

Confira também