2010-03-19 21 views
142

¿Hay una VB.NET equivalente a la palabra clave C# var?VB.NET equivalente a la palabra clave var C#

me gustaría utilizarlo para recuperar el resultado de una consulta LINQ.

+4

mi humilde opinión: Aunque se trata de una pregunta duplicado, las respuestas y los comentarios a continuación proporcionan más detalles sobre el uso de la opción 'infer' y' opción strict', que la pregunta anterior. Prefiero ** ESTE ** Q & A, a ese original. – ToolmakerSteve

Respuesta

134

La omisión del tipo en VB.NET (Visual Basic 9) se implícitamente el tipo de la variable.

Ésta es no lo mismo que "Option Strict Off" en versiones anteriores de VB.NET, como la variable es inflexible; que acaba de hacer lo que implícitamente (como el C# var) de palabras clave.

Dim foo = "foo" 

foo se declara como un String.

Option Infer debe ser en para que esto funcione correctamente.

+0

preguntó algo y encuentra la respuesta de inmediato –

+0

¿No es Dim foo equivalente a foo dinámico en su lugar? –

+3

@Quandry: no, no es –

13

basta con utilizar el Dim palabra clave convencional sin un tipo.

Mínimo ejemplo de trabajo:

Option Strict On ' Always a good idea 
Option Infer On ' Required for type inference 

Imports System 

Module MainModule 
    Sub Main() 
     Dim i = 42 
     Dim s = "Hello" 
     Console.WriteLine("{0}, {1}", i.GetType(), s.GetType()) 
     ' Prints System.Int32, System.String ' 
    End Sub 
End Module 
+1

¿No es esto incorrecto? De acuerdo con otras respuestas, ¿solo 'Option Infer' se necesita? (Option Strict resuelve un problema diferente.) – ToolmakerSteve

+0

@ToolmakerSteve Right. En una versión de vista previa de Visual Studio (no recuerdo cuál) necesitabas ambas, AFAIR. –

+0

El resultado '.GetType' sería el mismo si tuviera' Infer Off' y 'Strict Off', pero' i' y 's' en realidad serían' Object'. –

42

Es necesario Option Infer On y luego sólo tiene que utilizar la palabra clave Dim, por lo tanto:

Dim query = From x In y Where x.z = w Select x 

Contrariamente a algunas de las otras respuestas, que No necesidad Option Strict On .

Si utiliza el IDE de VS que sólo puede flotar sobre los nombres de las variables, pero para obtener los tipos en tiempo de compilación de las variables (GetType(variableName) no compila - "Tipo '<nombredevariable>' no está definido." - y VarType(variable) es en realidad sólo la versión VB de variable.GetType() que devuelve el tipo de la instancia almacenado en la variable en tiempo de ejecución) utilicé:

Function MyVarType(Of T)(ByRef Var As T) As Type 
    Return GetType(T) 
End Function 

en detalle:

  • sin Dim:

    Explicit Off, da Object

    Explicit On, el error "Nombre '' no se ha declarado."

  • con Dim: tipos

    • Infer On, da esperados
    • Infer Off:

      Strict On, el error "Option Strict On requiere todas las declaraciones para tener una 'medida' clasue."

      Strict Off, da Object

Como ya he mencionado en los comentarios, hay other reasons qué Option Strict On permite LINQ para llevar a cabo más útil. En concreto, no se puede conseguir Into Max(Anon.SomeString) trabajar con Option Strict Off , aunque hay una serie de soluciones.

+0

Puede simplemente usar 'x.GetType()' en VB - No había probado el código de mi respuesta, de ahí el error en mi respuesta anterior. Sin embargo, esto realmente produce el tipo de tiempo de ejecución que puede diferir de lo que obtiene con 'GetType (T)'. Finalmente, 'Strict On' si no es necesario para que esto funcione, pero siempre debe estar activado, y puede evitar errores si el programador ha olvidado especificar' Infer On'. –

+0

Acepto 'Option Strict On' es una buena práctica, pero' x.GetType' no proporciona la respuesta a la pregunta aquí. No lo he probado, pero con 'Infer Off' y 'Strict Off' puede funcionar un simple ejemplo 'Dim query = From ... '(aunque las agallas de las consultas de Linq pueden necesitar algunos de los otros efectos de' Strict On ' 'o' Infer On' para que funcione correctamente) y 'query.GetType()' devolverá el tipo anónimo, no 'Object', qué consulta será declarada. –

+0

Gracias por la corrección; He alterado mi respuesta para reflejar este ajuste. La redacción de los documentos de MSDN es incómoda y parece implicar que se requiere 'Strict', pero en realidad no dicen eso. –

-1

El objeto funcionó para mí en este ejemplo

C#

JToken projects = client.Search(ObjCode.PROJECT, new { groupID = userGroupID }); 
foreach(var j in projects["data"].Children()) { 
     Debug.WriteLine("Name: {0}", j.Value<string>("name")); 
} 

VB

Dim projects As JToken = client.Search(ObjCode.PROJECT, New With { _ 
Key .groupID = userGroupID _ 
}) 

For Each j As Object In projects("data").Children() 
     Debug.WriteLine("Name: {0}", j.Value(Of String)("name")) 
Next 
+7

El código de VB está utilizando el enlace tarde aquí. (No tendrías intellisense cuando escribes 'j'.) Esto no corresponde al código C#. –

+0

Así que estamos diciendo que no hay un equivalente directo en VB para la palabra clave var cuando se usa una variable de bucle en un bucle for, por ej. el j de arriba?Este es el escenario exacto en el que quiero var porque tengo una colección que vuelve de LINQ utilizando un tipo anónimo, así que ¿cómo obtengo los elementos? –

+2

@AlanMacdonald Simplemente use 'Para cada j En ...' el tipo se deducirá. –

Cuestiones relacionadas