2014-03-03 28 views
12

我們都知道VB的Nothing與C#的null類似,但並不相同。 (如果你不知道的是,看看this answer第一。)是否有一個VB.NET表達式* always *會產生null?

只是出於好奇,我想知道以下幾點:

是否有一個VB.NET表達式總是產生null


舉一個具體的例子,採取以下語句:

Dim o As Object = If(myBool, 5, ...) 

是否有可能有東西來取代...,這樣o5myBool是真實的,Nothing/nullmyBool是假的?

明顯的解決方案,這是行不通的:

  • Nothing問題(見上面的鏈接的答案),
  • DirectCast(Nothing, Object)(投用選項嚴格在編譯時錯誤),
  • DirectCast(Nothing, Integer?)適用於本示例,但不起作用一般(如果在此示例中將5替換爲5.0,則需要修改轉換)。

明顯的解決方法(將不能算作答覆):

  • 聲明一個Object變量或字段,其設置爲Nothing並使用該對...
  • 定義總是方法或屬性返回Nothing,
  • DirectCast第二個參數(5)到Object

注意:上面的示例只是一個示例。問題本身以粗體書寫。

+0

你想要一個適用於參考和值類型的單線程嗎?如果值類型不可爲空會怎麼樣?你能顯示這個代碼的_usage_嗎? – CodeCaster

+3

你的問題不是很清楚,你爲什麼總是需要'null'?使用可空類型而不是對象有什麼問題?如果你的例子是\t可互換提供了一個更好的例子,'Int32?'不是一個選項。 –

+0

@TimSchmelter:我認爲編寫一個自動化的C# - > VB.NET轉換器可能會有用,但主要我只是好奇。我不明白這個問題如何不清楚:「VB.NET表達式」是明確定義的,表達式的期望返回值在問題中清楚地陳述。 – Heinzi

回答

13

第一個答案我給錯過了一些分,但是這應該這樣做:

Dim o As Object = If(myBool, 5, DirectCast(Nullable.GetUnderlyingType(GetType(Integer)), Object)) 

它使用的事實,如果你傳遞一個類型,是不是一個空值Nullable.GetUnderlyingType將返回一個空引用類型 - 其中Integer不是。還有其他替代方案,例如Type.GetElementType()或者GetType(Object).BaseType

我已經檢查過,它適用於第二個操作數的多種不同類型。

這是有點惱人,你必須強制轉換爲Object ......我仍然在工作的替代品爲...

+0

@ Heinzi:啊 - 這一點的目的對我來說並不明顯。你把它變成一個通用的方法呢?(這當然會比所有這些搞亂更簡單。) –

+0

@Heinzi:實際上,如果你把它改成5.0,這個代碼仍然可以工作。 –

+0

@Heinzi:啊 - 我沒有沒有選項嚴格打開,忽略我以前的評論:( –

7

簡單的答案是,沒有。 VB.NET中沒有表達式只返回null。如您所知,當編譯器使用三元運算符分析命令時,它會根據兩個輸入來推斷輸出類型。如果兩個輸入之一是Nothing,則它必須完全依賴其他參數。因此,在VB中做「正確」的方法。NET是先投其他參數Object,從而迫使操作的輸出是一個Object

Dim o As Object = If(myBool, DirectCast(5, Object), Nothing) 

但是,如果你真的需要一個在線表達它,本身,始終計算爲null ,你總是可以通過調用lambda表達式,像這樣做:

Dim o As Object = If(myBool, 5.0, (Function() Nothing).Invoke()) 

這句法應該在任何情況下工作,總是會導致Nothing而不是潛在地導致默認值。

+0

是的。但請參閱「明顯的解決方法(不會算作答案)」的第3點「。 – Heinzi

+0

糟糕。快速閱讀問題我猜:( –

+0

我更新了我的答案,以包含另一個,儘管很醜,解決方案,哪種*符合您的標準。 –

0

System.DBNull.Value是最有可能你追求的。

擴展,從技術共和國:

...下面的C#代碼確定一個字符串值爲null:

string sTest = "Test"; if (sTest == null) { Console.WriteLine("sTest is Null"); } 

此代碼的工作沒有任何問題與C#,但沒有VB.NET等價於null關鍵字。相反,VB.NET使用Nothing關鍵字。下面的代碼演示了它的用法:

Dim sTest As String 
If (sTest Is Nothing) Then 
    Console.WriteLine("sTest is Null") 
End If 

混亂的另一個領域的事實,VB.NET不把無效和沒有平等地莖;因此,VB.NET程序員可能需要檢查兩個值。

支持的變化可能會引起混淆,但開發人員很少能同時在兩種語言中開發。另一方面,Microsoft提供了使用空值的統一方法:基本System.Convert名稱空間包含DBNull對象。

DBNull

使用該DBNull類的指示不存在一個已知的值的。 雖然Microsoft文檔說它通常位於數據庫 應用程序中,但您也可以將它用於任何類型的數據。

If (sTest.Equals(System.DBNull.Value) Then 
    Console.WriteLine("sTest is Null") 
End If 

- 逐字從Working with Null values in the .NET Framework

+1

'System.DBNull.Value IsNot Nothing'。 – nmclean

0

您可以創建一個自己(選擇一個不同的名稱功能,如果你喜歡):

Private Function ValueOrNull(expression As Boolean, value As Object) As Object 
    If expression Then Return value 
    Return Nothing 
End Function 

用法:

Dim myBool As Boolean 
Dim o As Object = ValueOrNull(myBool, 5) 

適用於任何類型,包括您的示例5.0

相關問題