是否有一个VB.NET表达式,* always *产生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?)适用于此示例,但一般不起作用(如果在此示例中将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的示例。