【发布时间】:2011-05-08 00:45:21
【问题描述】:
我只是朝自己的脚开枪,想知道是否有真正的理由使这种情况成为可能。
而且无论如何,为了方便未来的射手,这个问题可以保留。
假设我们在 vb.net 中有一个可以为空的值:
Dim i as Integer?
我们想为它分配一个值,基于一个条件,并使用三元运算符,因为它是如此简洁和丰富:
i = If(condition(), Nothing, 42)
也就是说,如果条件是true,则使用可空性,否则使用值。
在这一点上发生了枪击事件。没有明显的原因,VB 编译器决定Nothing 和Integer 的公共基本类型是Integer,此时它默默地将语句翻译为:
i = If(condition(), 0, 42)
现在,如果您要在 C# 中执行此操作:
i = (condition()) ? null : 42;
您会立即收到一个编译器错误,指出 <null> 不能与 int 很好地混合。这很好,因为如果我这次采用 C# 方式,我的脚会更健康。要编译它,您必须明确编写:
i = (condition()) ? null : (int?)42;
现在,您可以在 VB 中做同样的事情并获得您期望的正确空值:
i = If(condition(), Nothing, CType(42, Integer?))
但这首先需要你的脚射门。没有编译器错误,也没有警告。那是Explicit On 和Strict On。
所以我的问题是,为什么?
我应该将此视为编译器错误吗?
或者有人可以解释为什么编译器会这样吗?
【问题讨论】:
-
因为,正如您所发现的那样,VB 是一种可怕的语言,它会做一些您没有要求它做的随机事情,以提供帮助。
-
@cdhowie - 除非你已经尝试了几个星期,否则不要敲它。 VB.Net 与 vb6 相比已经走了很长一段路。
-
@Joel:我同意这一点,但抛光的粪便仍然是粪便。 :)
-
@cdhowie 任何没有学习过新语言特殊功能的人都会觉得这种语言令人沮丧。任何将这种挫败感归咎于语言的人都需要重新考虑他们的反应。
-
@Alex Nah,我是使用过很多种不同语言的人之一。我开始使用 C64 BASIC 进行编程,然后从那里转到 VB1,最后转到 VB4、5、6 和 .NET。这并不是说我没有接触过 VB 块,这使它成为我的语言和其他人一样多。我已经忍受了足够长的时间来知道我为什么不喜欢它。
标签: c# vb.net nullable ternary-operator