是否有一个VB.NET表达式,* always *产生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.0
替换为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
的示例。