Это просто унарная версия оператора +
(см. docs ), примененная дважды.
Foobar(++i)
Foobar(+(+i))
Foobar(+(+(i)))
' These are all the same
Для числовых значений унарный +
(т. Е. +
без второго операнда) ничего не делает:
Если выражение2 отсутствует, оператор + является унарным оператором идентичности для неизмененного значения выражения.
Однако , из документации не совсем понятно, что он будет делать с нечисловыми c значениями. В документации объясняются различные случаи с двумя операндами, которые, похоже, здесь не применимы.
Есть даже одно предложение, которое звучит так, как будто его можно применить, но оно не делает то, что он говорит, что если используется с унарным +
:
Если выражение Object
оценивается как Nothing
или DBNull
, оператор +
обрабатывает его как String
со значением of ""
.
Итак, вы ожидаете, что +Nothing
также дает ""
, но вместо этого дает 0
. Фактически, похоже, что унарный +
преобразует нечисловые типы в Double
, включая строки, для которых +
иначе означало бы конкатенацию (например, +"1.234"
дает 1.234
, а +"Hello"
дает ошибку что эта строка не может быть преобразована в Double
- а с Option Strict On
вы все равно не можете преобразовать никакую строку неявно). Кажется, что он больше похож на двоичный +
с 0.0
в качестве первого операнда.
Вы также можете перегрузить унарный +
отдельно от двоичного +
и дать ему совершенно другое значение *. (Или сделайте наоборот - заставьте его ничего не делать даже для нечислового типа c, например, что делает TimeSpan
- он снова возвращает исходный временной интервал, когда к нему применяется унарный +
, а не Double
.)
*: Это, вероятно, не такая уж хорошая идея. При перегрузке оператора смысл его всегда должен быть интуитивным.