[英]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
為真時o
為5
而myBool
為假時為Nothing/null
?
顯而易見的解決方案無效:
Nothing
(見上面鏈接答案的問題), DirectCast(Nothing, Object)
(使用Option Strict On拋出編譯時錯誤), DirectCast(Nothing, Integer?)
的作品在這個例子中,但一般不工作(如果更換5
與5.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.