VB.NET эквивалентен ключевому слову С# var

Существует ли эквивалент VB.NET для ключевого слова С# var?

Я хотел бы использовать его для получения результата запроса LINQ.

Ответ 1

Опущение типа в VB.NET(Visual Basic 9) будет неявно вводить переменную.

Это не то же самое, что "Option Strict Off" в предыдущих версиях VB.NET, поскольку переменная строго типизирована; он просто сделал это неявно (например, С# var).

Dim foo = "foo"

foo объявляется как String.

Параметр Infer должен быть на, чтобы это нормально функционировало.

Ответ 2

Вам нужно Option Infer On, а затем просто используйте ключевое слово Dim, таким образом:

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

В отличие от некоторых других ответов вам не нужно Option Strict On.

Если вы используете VS IDE, вы можете просто нависать над именами переменных, но для получения переменных типа времени компиляции (GetType(variableName) не компилируется - "Тип" <variablename> не определен. "- и VarType(variable) на самом деле является только версией VB variable.GetType(), которая возвращает тип экземпляра, хранящегося в переменной во время выполнения). Я использовал:

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

Подробнее:

  • без Dim:

    Explicit Off, дает Object

    Explicit On, ошибка "Имя" не объявлена.

  • с Dim:

    • Infer On, дает ожидаемые типы
    • Infer Off:

      Strict On, ошибка "Option Strict On" требует, чтобы все объявления имели класс "As".

      Strict Off, дает Object

Как я уже упоминал в комментариях, есть другие причины, почему Option Strict On позволяет Linq выполнять более полезную работу. В частности, вы не можете получить Into Max(Anon.SomeString) для работы с Option Strict Off, хотя существует ряд обходных путей.

Ответ 3

Просто используйте обычное ключевое слово Dim без типа.

Минимальный рабочий пример:

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

Ответ 4

Объект работал у меня в этом примере

С#

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