2010-03-19 110 views
142

是否有与VB.NET等价的C#var关键字?VB.NET等价于C#var关键字

我想用它来检索LINQ查询的结果。

+4

恕我直言:虽然这是一个重复的问题,答案和评论下面提供有关使用'选项infer'和'详细选项严格“,比以前提出的问题。我更喜欢** THIS ** Q&A,与原版。 – ToolmakerSteve 2013-12-09 21:45:14

回答

134

忽略VB.NET(Visual Basic 9)中的类型将隐式键入变量。

这是一样的“选项严格关”在VB.NET以前的版本,作为变量强类型;它只是隐含地完成(如C#var)的关键字。

Dim foo = "foo" 

foo被声明为String

Option Infer必须是为了使它正常工作。

+0

问了一些东西,马上找到答案 – 2011-03-17 19:01:15

+0

Dim foo等价于动态foo而不是? – 2012-08-31 05:51:14

+3

@Quandry:不,它不是 – 2012-08-31 11:04:30

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解决了不同的问题。) – ToolmakerSteve 2013-12-09 21:48:14

+0

@ToolmakerSteve正确。在Visual Studio的预览版中(不记得哪一个)你需要两个,AFAIR。 – 2013-12-09 22:09:47

+0

如果你有'Infer Off'和'Strict Off',''GetType'的结果是一样的,但'i'和's'实际上是'Object'。 – 2013-12-10 13:34:18

42

你需要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,错误“选项严格On要求所有声明有一个 '作为' clasue。“

      Strict Off,给人Object

正如我在评论中提到的,有other reasons为什么Option Strict On允许LINQ到更有效地执行。特别是,你不能得到Into Max(Anon.SomeString)Option Strict Off工作,尽管有一些解决方法

+0

您可以简单地在VB中使用'x.GetType()' - 我没有测试过我的答案代码,因此我的旧答案中出现了错误。但实际上这会产生运行时类型,它可能与使用'GetType(T)'得到的不同。最后,如果程序员不需要指定'Infer On',那么'Strict On'如果当然不需要这个工作,但总是应该一直开着,并且可以防止错误。 – 2010-03-22 07:56:53

+0

我同意'Option Strict On'是很好的做法,但'x.GetType'不提供这里提出的问题的答案。我没有测试过它,但是通过'Infer Off'和'Strict Off',一个简单的'Dim query = From ...'示例可能会工作(尽管Linq查询的内容可能需要'Strict On '或'Infer On'正常工作),'query.GetType()'将返回匿名类型,而不是'Object',该查询将被声明为。 – 2010-03-23 03:57:14

+0

感谢您的纠正;我改变了我的答案以反映这种调整。 MSDN文档的措辞很尴尬,似乎暗示“严格”是必需的,但他们实际上并没有这样说。 – 2010-03-23 16:56:35

-1

对象在这个例子中为我工作

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

VB代码在这里使用了后期绑定。 (当你键入'j.'时,你不会有智能感知。)这不会对应于C#代码。 – 2012-02-14 03:55:29

+0

所以我们说在for循环中使用循环变量时,在VB中没有关于var关键字的直接等价关系,例如,上面的j?这是我想要var的确切场景,因为我有一个使用匿名类型从LINQ返回的集合,所以如何获取元素?! – 2013-07-03 13:19:26

+2

@AlanMacdonald只要使用'For Each j In ...',就可以推断出类型。 – 2013-08-05 17:46:53