是否有一个VB.NET表达式**总是*产生null?

Hei*_*nzi 12 .net c# vb.net

我们都知道VB Nothing与C#相似,但不相同null.(如果您不知道,请先查看此答案.)

出于好奇,我想知道以下内容:

是否有一个总能产生的VB.NET表达式null


举一个具体的例子,采取以下声明:

Dim o As Object = If(myBool, 5, ...)
Run Code Online (Sandbox Code Playgroud)

是否有可能更换...的东西,这样o5myBool是真实的,Nothing/nullmyBool是假的?

显而易见的解决方案无效:

  • Nothing (参见上面链接答案的问题),
  • DirectCast(Nothing, Object) (使用Option Strict On抛出编译时错误),
  • DirectCast(Nothing, Integer?)适用于此示例,但一般不起作用(如果在此示例中替换5,则5.0需要修改转换).

明显的解决方法(不算作答案):

  • 声明Object变量或字段,将其设置为Nothing并使用它...,
  • 定义始终返回的方法或属性Nothing,
  • DirectCast第二个参数(5)到Object.

注意:上面的例子只是一个例子.问题本身是用粗体写的.

Jon*_*eet 13

我给出的第一个答案错过了一些观点,但是应该这样做:

Dim o As Object = If(myBool, 5, DirectCast(Nullable.GetUnderlyingType(GetType(Integer)), Object))
Run Code Online (Sandbox Code Playgroud)

Nullable.GetUnderlyingType如果你传递一个不是可以为空的值类型的类型,那么它将使用返回空引用的事实 - 事实Integer并非如此.存在其他替代方案,例如Type.GetElementType()或可能GetType(Object).BaseType.

我已经检查过,这适用于第二个操作数的多种不同类型.

你必须施展Object...... 这有点令人讨厌......我还在努力寻找替代方案......


Ste*_*art 7

简单回答是不.VB.NET中没有表达式只返回null.如您所知,当编译器使用三元运算符解析命令时,它会根据两个输入推断输出类型.如果两个输入中的一个是Nothing,则它必须仅依赖于另一个参数.因此,在VB.NET中执行此操作的"正确"方法是首先将其他参数Object强制转换为,从而强制操作的输出为Object:

Dim o As Object = If(myBool, DirectCast(5, Object), Nothing)
Run Code Online (Sandbox Code Playgroud)

但是,如果你真的需要一个内联表达式,它本身总是可以求值null,你总是可以通过调用一个lambda表达式来实现它,如下所示:

Dim o As Object = If(myBool, 5.0, (Function() Nothing).Invoke())
Run Code Online (Sandbox Code Playgroud)

该语法应该适用于任何情况,并且总是会导致Nothing而不是可能导致默认值.