我们都知道VB Nothing与C#相似,但不相同null.(如果您不知道,请先查看此答案.)
出于好奇,我想知道以下内容:
是否有一个总能产生的VB.NET表达式null?
举一个具体的例子,采取以下声明:
Dim o As Object = If(myBool, 5, ...)
是否有可能更换...的东西,这样o是5当myBool是真实的,Nothing/null当myBool是假的?
显而易见的解决方案无效:
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))
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而不是可能导致默认值.
| 归档时间: | 
 | 
| 查看次数: | 849 次 | 
| 最近记录: |