Inferenza dei tipi locali

Aggiornamento: Luglio 2008

Il compilatore in Visual Basic 2008 utilizza una inferenza dei tipi per determinare i tipi di dati delle variabili locali dichiarate senza una clausola As. Tramite l'inferenza, il compilatore deduce il tipo della variabile dal tipo dell'espressione di inizializzazione. Questo consente di dichiarare le variabili senza dichiarare in modo esplicito un tipo, come illustrato nell'esempio seguente.

Public Sub inferenceExample()

    ' Using explicit typing.
    Dim num1 As Integer = 3

    ' Using local type inference.
    Dim num2 = 3

End Sub
Nota:

Non è possibile utilizzare l'inferenza dei tipi locali per dichiarare i campi di classi. Se num2 nell'esempio precedente fosse un campo anziché una variabile locale, la dichiarazione genererebbe un errore con Option Strict on e classificherebbe num2 come Object con Option Strict off. Analogamente, i tipi di variabili statiche non possono essere dedotti quando Option Strict è on. Con Option Strict off, il tipo di staticVar in Static staticVar = 5 è Object.

Il codice che utilizza l'inferenza dei tipi è simile al codice basato sull'associazione tardiva. Tuttavia, l'inferenza dei tipi digita può tipizzare fortemente la variabile anziché lasciarla come Object. Il compilatore utilizza l'inizializzatore della variabile per determinare in fase di compilazione il tipo di variabile per produrre codice con associazione anticipata. L'oggetto num2 nell'esempio precedente viene tipizzato come un Integer.

Il comportamento delle variabili con associazione anticipata differisce da quello delle variabili con associazione tardiva per le quali il tipo è noto solo in fase di esecuzione . Conoscere il tipo in anticipo consente al compilatore di identificare i problemi prima dell'esecuzione, di allocare la memoria con precisione e di eseguire altre ottimizzazioni. L'associazione anticipata consente anche all'ambiente di sviluppo integrato (IDE) di Visual Basic di fornire la guida di IntelliSense per i membri di un oggetto. L'associazione anticipata è preferibile anche in termini di prestazioni. Perché su tutti i dati archiviati in una variabile ad associazione tardiva deve essere eseguito il wrapping come tipi Objecte l'accesso in fase di esecuzione ai membri del tipo rende più lento il programma.

Nota:

Se non si desidera che num2 nell'esempio precedente sia tipizzato come un Integer, è possibile specificare un altro tipo utilizzando una dichiarazione come Dim num3 As Object = 3 o Dim num4 As Double = 3.

Esempi

Si verifica l'inferenza dei tipi quando una variabile locale viene dichiarata senza una clausola As e senza che le sia stato assegnato un valore. Il compilatore utilizza il tipo del valore come tipo della variabile. Ad esempio, in ognuna delle righe di codice riportate di seguito, viene dichiarata una variabile di tipo String.

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

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

Nel codice seguente vengono illustrate due modalità equivalenti per creare una matrice di valori integer.

' 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}

È possibile utilizzare l'inferenza dei tipi per determinare il tipo di una variabile di controllo del ciclo. Nel codice seguente, il compilatore deduce che number è un Integer, perché someNumbers2 è una matrice di valori integer.

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

L'inferenza dei tipi locali può essere utilizzata nelle istruzioni Using per definire il tipo del nome della risorsa, come illustrato nell'esempio seguente.

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

Il tipo di una variabile può anche essere dedotto dai valori restituiti da funzioni, come illustrato nell'esempio seguente. Sia pList1 che pList2, sono elenchi di processi.

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

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

Option Infer

Una nuova opzione, Option Infer, consente di specifica se l'inferenza dei tipi locali è consentita in un particolare file. Per attivare o bloccare l'opzione, digitare una delle seguenti istruzioni all'inizio del file.

Option Infer On

Option Infer Off

Se non si specifica un valore per Option Infer nel codice, l'impostazione predefinita del compilatore è Option Infer On per i progetti creati in Visual Basic 2008 e Option Infer Off per i progetti aggiornati da versioni precedenti . Per ulteriori informazioni, vedere Istruzione Option Infer e /optioninfer.

Nota:

Se il valore impostato per Option Infer in un file è in conflitto con il valore impostato nell'IDE o sulla riga di comando, il valore nel file ha precedenza.

Restrizioni

L'inferenza dei tipi può essere utilizzata solo per variabili locali non statiche; non può essere utilizzata per determinare tipo di campi, proprietà, o funzioni di classi.

Vedere anche

Concetti

Tipi anonimi

Associazione anticipata e tardiva

Introduzione a LINQ in Visual Basic

Riferimenti

Istruzione For Each...Next (Visual Basic)

Istruzione For...Next (Visual Basic)

Istruzione Option Infer

/optioninfer

Cronologia delle modifiche

Date

History

Motivo

Luglio 2008

Modificato il nome della variabile di controllo del ciclo nel testo della sezione "Esempi" da num a number affinché ci sia corrispondenza con il nome nel codice.

Commenti e suggerimenti dei clienti.