簡體   English   中英

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

[英]Is there a VB.NET expression that *always* yields null?

我們都知道VB的Nothing與C#的null相似,但不相同。 (如果您不知道,請先查看此答案 。)

出於好奇,我想知道以下內容:

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


舉一個具體的例子,采取以下聲明:

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

有可能用某些東西替換...myBool為真時o5myBool為假時為Nothing/null

顯而易見的解決方案無效:

  • Nothing (見上面鏈接答案的問題),
  • DirectCast(Nothing, Object) (使用Option Strict On拋出編譯時錯誤),
  • DirectCast(Nothing, Integer?)的作品在這個例子中,但一般不工作(如果更換55.0在這個例子中,你需要修改投)。

明顯的解決方法(不算作答案):

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

注意:上面的例子只是一個例子。 問題本身是用粗體寫的。

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

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

這使用Nullable.GetUnderlyingType如果傳遞一個不是可以為空的值類型的類型而返回空引用的事實 - 而Integer則不是。 存在其他替代方法,例如Type.GetElementType() ,或者可能是GetType(Object).BaseType

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

你必須施展給Object有點煩人......我還在努力尋找替代方案......

簡單回答是不。 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而不是可能導致默認值。

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不會將null和Nothing視為平等的事實; 因此,VB.NET程序員可能必須檢查這兩個值。

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

DBNull

DBNull類的使用表明缺少已知值。 雖然Microsoft文檔說它通常在數據庫應用程序中,但您也可以將它與任何類型的數據一起使用。

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

- 從.NET Framework中使用Null值逐字逐句

您可以自己創建一個(如果您願意,可以為該函數選擇一個不同的名稱):

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的示例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM