2010-03-19 118 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