Inferência de tipo local (Visual Basic)Local Type Inference (Visual Basic)

O compilador do Visual Basic usa inferência de tipo para determinar os tipos de dados de variável local declarada sem um As cláusula.The Visual Basic compiler uses type inference to determine the data types of local variables declared without an As clause. O compilador infere o tipo da variável do tipo da expressão de inicialização.The compiler infers the type of the variable from the type of the initialization expression. Isso permite que você declare variáveis sem especificar explicitamente um tipo, conforme mostrado no exemplo a seguir.This enables you to declare variables without explicitly stating a type, as shown in the following example. Como resultado de declarações, ambos num1 e num2 são fortemente tipadas como inteiros.As a result of the declarations, both num1 and num2 are strongly typed as integers.

Public Sub inferenceExample()

    ' Using explicit typing.
    Dim num1 As Integer = 3

    ' Using local type inference.
    Dim num2 = 3

End Sub

Observação

Se você não quiser num2 no exemplo anterior para ser digitado como um Integer, você pode especificar outro tipo usando uma declaração como Dim num3 As Object = 3 ou Dim num4 As Double = 3.If you do not want num2 in the previous example to be typed as an Integer, you can specify another type by using a declaration like Dim num3 As Object = 3 or Dim num4 As Double = 3.

Observação

Inferência de tipo pode ser usada somente para as variáveis locais não-estático; ele não pode ser usado para determinar o tipo de funções, propriedades ou campos de classe.Type inference can be used only for non-static local variables; it cannot be used to determine the type of class fields, properties, or functions.

Inferência de tipo local se aplica no nível de procedimento.Local type inference applies at procedure level. Ele não pode ser usado para declarar variáveis no nível de módulo (dentro de uma classe, estrutura, módulo ou interface mas não dentro de um procedimento ou bloco).It cannot be used to declare variables at module level (within a class, structure, module, or interface but not within a procedure or block). Se num2 no exemplo anterior foi um campo de uma classe em vez de uma variável local em um procedimento, a declaração causará um erro com Option Strict e deseja classificar num2 como um Object com Option Strict off.If num2 in the previous example were a field of a class instead of a local variable in a procedure, the declaration would cause an error with Option Strict on, and would classify num2 as an Object with Option Strict off. Da mesma forma, inferência de tipo local não se aplica a variáveis de nível de procedimento declaradas como Static.Similarly, local type inference does not apply to procedure level variables declared as Static.

Tipo de inferência vs. Associação tardiaType Inference vs. Late Binding

Código que usa a inferência de tipo é semelhante a códigos que contem com associação tardia.Code that uses type inference resembles code that relies on late binding. No entanto, a inferência de tipo tipos altamente variável em vez de deixá-lo como Object.However, type inference strongly types the variable instead of leaving it as Object. O compilador usa o inicializador de variável para determinar o tipo da variável no tempo de compilação para gerar código de associação inicial.The compiler uses a variable's initializer to determine the variable's type at compile time to produce early-bound code. No exemplo anterior, num2, como num1, é digitado como um Integer.In the previous example, num2, like num1, is typed as an Integer.

O comportamento de variáveis de early bound difere das variáveis de associação tardia, para o qual o tipo é conhecido apenas em tempo de execução.The behavior of early-bound variables differs from that of late-bound variables, for which the type is known only at run time. Saber o tipo de início permite que o compilador identificar problemas antes da execução, alocar memória com precisão e executar outras otimizações.Knowing the type early enables the compiler to identify problems before execution, allocate memory precisely, and perform other optimizations. Associação antecipada também permite que o ambiente de desenvolvimento integrado (IDE) para fornecer IntelliSense ajuda sobre os membros de um objeto do Visual Basic.Early binding also enables the Visual Basic integrated development environment (IDE) to provide IntelliSense Help about the members of an object. Associação antecipada também é preferencial para o desempenho.Early binding is also preferred for performance. Isso ocorre porque todos os dados armazenados em uma variável de associação tardia devem ser encapsulados como tipo Object, e acessar os membros do tipo em tempo de execução faz com que o programa mais lento.This is because all data stored in a late-bound variable must be wrapped as type Object, and accessing members of the type at run time makes the program slower.

ExemplosExamples

Inferência de tipo ocorre quando uma variável local é declarada sem um As cláusula e inicializado.Type inference occurs when a local variable is declared without an As clause and initialized. O compilador usa o tipo de valor inicial atribuído como o tipo da variável.The compiler uses the type of the assigned initial value as the type of the variable. Por exemplo, cada uma das linhas de código a seguir declara uma variável do tipo String.For example, each of the following lines of code declares a variable of type String.

' Using explicit typing.
Dim name1 As String = "Springfield"

' Using local type inference.
Dim name2 = "Springfield"

O código a seguir demonstra duas maneiras equivalentes para criar uma matriz de inteiros.The following code demonstrates two equivalent ways to create an array of integers.

' Using explicit typing.
Dim someNumbers1() As Integer = New Integer() {4, 18, 11, 9, 8, 0, 5}

' Using local type inference.
Dim someNumbers2 = New Integer() {4, 18, 11, 9, 8, 0, 5}

É conveniente usar inferência de tipo para determinar o tipo de uma variável de controle de loop.It is convenient to use type inference to determine the type of a loop control variable. No código a seguir, o compilador infere que number é um Integer porque someNumbers2 do exemplo anterior é uma matriz de inteiros.In the following code, the compiler infers that number is an Integer because someNumbers2 from the previous example is an array of integers.

Dim total = 0
For Each number In someNumbers2
    total += number
Next

Inferência de tipo local pode ser usada em Using instruções para estabelecer o tipo do nome do recurso, como demonstrado no exemplo a seguir.Local type inference can be used in Using statements to establish the type of the resource name, as the following example demonstrates.

Using proc = New System.Diagnostics.Process
    ' Insert code to work with the resource.
End Using

O tipo de uma variável também pode ser inferido de valores de retorno de funções, como demonstrado no exemplo a seguir.The type of a variable can also be inferred from the return values of functions, as the following example demonstrates. Ambos pList1 e pList2 são conjuntos de processos porque Process.GetProcesses retorna uma matriz de processos.Both pList1 and pList2 are arrays of processes because Process.GetProcesses returns an array of processes.

' Using explicit typing.
Dim pList1() As Process = Process.GetProcesses()

' Using local type inference.
Dim pList2 = Process.GetProcesses()

Opção InferOption Infer

Option Inferpermite que você especifique se a inferência de tipo local é permitida em um arquivo específico.Option Infer enables you specify whether local type inference is allowed in a particular file. Para permitir ou bloquear a opção, digite uma das seguintes instruções no início do arquivo.To enable or to block the option, type one of the following statements at the start of the file.

Option Infer On

Option Infer Off

Se você não especificar um valor para Option Infer em seu código, o padrão do compilador é Option Infer On.If you do not specify a value for Option Infer in your code, the compiler default is Option Infer On. Para projetos atualizados do Visual Basic 2008Visual Basic 2008 ou anterior, o padrão do compilador é Option Infer Off.For projects upgraded from Visual Basic 2008Visual Basic 2008 or earlier, the compiler default is Option Infer Off.

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.If the value set for Option Infer in a file conflicts with the value set in the IDE or on the command line, the value in the file has precedence.

Para obter mais informações, consulte opção Infer instrução e página de compilação, Designer de projeto (Visual Basic).For more information, see Option Infer Statement and Compile Page, Project Designer (Visual Basic).

Consulte tambémSee Also

Tipos AnônimosAnonymous Types
Associação Antecipada e TardiaEarly and Late Binding
Instrução For Each...NextFor Each...Next Statement
Instrução For...NextFor...Next Statement
Instrução Option InferOption Infer Statement
/optioninfer/optioninfer
Introdução ao LINQ no Visual BasicIntroduction to LINQ in Visual Basic