++ 在 VB.NET 中做什么(如果有的话)?

What (if anything) does ++ do in VB.NET?

我是 Visual Basic 的新手(我的背景主要是 C#)所以我最近才发现 ++i 与 VB.NET 中的 i+=1 不同。但是,当我将 ++i 作为参数传递时,我的 VB.NET 代码仍然可以编译,即使它没有增加变量:

++i          'doesn't compile
i++          'doesn't compile
Foobar(i++)  'doesn't compile
Foobar(++i)  'compiles, but doesn't increment i

上面最后一条语句没有导致错误的事实让我想知道 ++ 是否确实在 VB.NET 中确实意味着什么,只是不是我一开始认为的意思。如果没有,是否有其他原因没有导致错误?

VB 中没有 ++ 运算符。 + 一元运算符就像应用于数字的 - 一元运算符。默认情况下,数字是正数,但是,正如您可以通过在数字前面加上 - 运算符来显式地使它为负数一样,您可以通过在它前面加上 + 运算符来使它显式地为正数。您可以根据需要使用任意数量的 + 运算符。同样,您可以使用任意数量的 - 运算符。不同之处在于 + 运算符不会更改 - 运算符所做的值。

在基于 C 的语言中,赋值实际上 return 一个在 VB 中没有的值。在 C# 中,您可以这样做:

i += 1

它将获得 i 的值,将其加 1,将结果分配回 i 然后 return 该结果,因此您可以在其中使用该表达式期望值。在 VB 中,它在赋值之前执行所有相同的操作,但它没有 return 值,因此您不能在需要值的地方使用该表达式。

在基于 C 的语言中,放置 ++ 运算符的位置会有所不同。表达式:

++i

增加 i 和 returns 最终值,而这个表达式:

i++

增加 i 和 return 原始值。这就是为什么有些人认为 C++ 语言实际上应该命名为 ++C。

它只是应用了两次 + 运算符(参见 docs)的一元版本。

Foobar(++i)
Foobar(+(+i))
Foobar(+(+(i)))
' These are all the same

对于数值,一元 +(即没有第二个操作数的 + 运算符)什么都不做:

If expression2 is absent, the + operator is the unary identity operator for the unchanged value of an expression.

但是,文档中并未完全清楚它将对非数字值执行的操作。文档用 两个 操作数解释了各种情况,这些操作数似乎都不适用于此处。

甚至有一句话听起来可以应用,但如果与一元一起使用,它就不会像它所说的那样+:

If either Object expression evaluates to Nothing or DBNull, the + operator treats it as a String with a value of "".

所以你会期望 +Nothing 也给出 "",但它给出 0。事实上,一元 + 似乎将非数字类型转换为 Double,包括 + 否则意味着连接的字符串(例如 +"1.234" 给出 1.234,并且 +"Hello" 给出了一个错误,该字符串无法转换为 Double - 而对于 Option Strict On,您无论如何都无法隐式转换任何字符串)。它的行为似乎更像是一个二进制 +,第一个操作数是 0.0

您还可以 overload 一元 + 与二进制 + 分开,并赋予它完全不同的含义*。 (或者做相反的事情 - 即使在非数字类型上也不做任何事情,例如 TimeSpan 所做的 - 当一元 + 应用于它时,它再次 returns 原始时间跨度,而不是 Double.)

*:但这可能不是一个好主意。重载运算符时,其含义应始终直观。