Good questions. There isn’t a precedence rule where either Double or Currency automatically wins; the operand types determine the operation.
Your example works as written:
Var foo As Object = Currency(5.32) + Currency(2.23)
Here, Currency(...) acts as an explicit cast. Because both values are exact Currency literals, the addition is Currency arithmetic and foo contains a Currency value of exactly 7.55.
New Currency(...) is also available, but it serves a slightly different purpose: it converts an Integer or Double and rounds to four fractional digits when necessary. For example, when converting a calculated Double, use either:
Var amount As Currency = New Currency(someDoubleExpression)
or:
Var amount As Currency = Currency.FromDouble(someDoubleExpression)
A bare real literal such as 5.32 is otherwise a Double. Contextual conversion applies when an exact literal is directly required to be Currency:
Var amount As Currency = 5.32 # Currency
It does not propagate backwards through an entire expression:
Var amount As Currency = 5.32 + 2.23 # Double arithmetic; compile error
Similarly, addition and subtraction require Currency on both sides. Multiplication and division may use an Integer or Double scalar:
Var price As Currency = 19.95
Var total As Currency = price * 3
Currency / Currency returns a Double, since the result is a ratio rather than an amount.
On performance, Currency is not implemented like C# decimal. It is an inline fixed-point value backed by a scaled 64-bit integer, with four fractional digits and no heap allocation. Addition and subtraction operate directly on those scaled integers. Multiplication and division perform decimal rescaling and rounding internally, so I wouldn’t claim they are as fast as Double without benchmarks, but the design is intentionally well suited to normal business and financial calculations.
It also maps naturally to fixed-scale database columns, and its ScaledValue property is available when exact raw persistence is useful.
So I agree with your conclusion: a Currency suffix would add language complexity for a fairly obscure case that can already be expressed clearly with Currency(...). I’m inclined to keep the syntax simple.