【发布时间】:2014-03-03 13:11:58
【问题描述】:
我们都知道 VB 的 Nothing 与 C# 的 null 相似但不等价。 (如果您不知道,请先查看this answer。)
出于好奇,我想知道以下内容:
是否存在始终产生 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。
注意:上面的例子只是一个例子。问题本身用粗体书写。
【问题讨论】:
-
您想要一个既适用于引用类型又适用于值类型的单线器?如果值类型不可为空怎么办?你能展示一下这段代码的用法吗?
-
你的问题不是很清楚,为什么你需要总是得到
null?使用可空类型而不是对象有什么问题?如果您的示例是可互换的,请提供一个更好的示例,其中Int32?不是一个选项。 -
@TimSchmelter:我想在编写自动 C#->VB.NET 转换器时类似的东西可能很有用,但主要是我只是好奇。我看不出问题是如何不清楚的:“VB.NET 表达式”定义明确,并且在问题中明确说明了表达式所需的返回值。
-
如果您链接的答案是Nothing和null之间的唯一区别,那么这个问题没有意义。对于任何可能产生 null 的类型,default(T) 都会产生 null。所以你要问的基本上是:“是否有一个 VB.NET 表达式不仅会为可能的类型产生 null,而且不会产生 null 的类型?”
-
@TimSchmelter:“不,绝对没有这样的表达”将是一个完美的答案。