I had until recently been under the impression that the
Dim s As String = "12345.12345-"
Dim d As Double = CDbl(s)
It uses Microsoft.VisualBasic.CompilerServices.Conversions.ToDouble(). That function contains a Select statement on the object's GetTypeCode() return value so it can use a custom converter based on the type of the argument. The string converter considers the possibility that the string might contain a currency value and does some processing on the string to deal with that. One allowed format for currency values is a trailing negative sign.
This is not particularly cheap. The quickest way to achieve the same conversion is:
Dim s As String = "12345.12345-" Dim d As Double = Double.Parse(s, Globalization.NumberStyles.Any)