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

140

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

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

  • 4
    ИМХО: Несмотря на то, что это дублирующий вопрос, ответы и комментарии ниже предоставляют более подробную информацию об использовании option infer и option strict , чем ранее заданный вопрос. Я предпочитаю ЭТО Q & A, этому оригиналу.
Теги:
linq
var
keyword

4 ответа

138

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

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

Dim foo = "foo"

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

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

  • 0
    спросил что-то и сразу найду ответ
  • 0
    Разве Dim foo не эквивалентен динамическому foo?
Показать ещё 2 комментария
44

Вам нужно 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, хотя существует ряд обходных путей.

  • 0
    Вы можете просто использовать x.GetType() в VB - я не проверял код моего ответа, поэтому ошибка в моем старом ответе. Это фактически дает тип времени выполнения, который может отличаться от того, что вы получаете, используя GetType(T) . Наконец, Strict On если курс не требуется для того, чтобы это работало, но все равно должен быть всегда Infer On , и может предотвратить ошибки, если программист забыл указать Infer On .
  • 0
    Я согласен, что Option Strict On является хорошей практикой, но x.GetType не дает ответа на вопрос, заданный здесь. Я не тестировал его, но с Infer Off и Strict Off простой пример Dim query = From ... может работать (хотя для интуиции запросов Linq могут потребоваться некоторые другие эффекты Strict On или Infer On для корректной работы) и query.GetType() вернет анонимный тип, а не Object , запрос которого будет объявлен.
Показать ещё 3 комментария
13

Просто используйте обычное ключевое слово 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
  • 1
    Разве это не так? По другим ответам нужен только Option Infer ? (Option Strict решает другую проблему.)
  • 0
    @ ToolmakerSteve Верно. В предварительной версии Visual Studio (не помню, какая именно) вам понадобились оба, AFAIR.
Показать ещё 1 комментарий
-1

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

С#

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
  • 8
    Код VB использует позднюю привязку здесь. (У вас не будет intellisense при вводе j. .) Это не соответствует коду C #.
  • 0
    Таким образом, мы говорим, что в VB нет прямого эквивалента для ключевого слова var при использовании переменной цикла в цикле for, например j выше? Это именно тот сценарий, который мне нужен var, потому что у меня есть коллекция, возвращающаяся из LINQ с использованием анонимного типа, так как мне получить элементы ?!
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню