最近,我遇到了一种奇怪的行为,那就是一个可为空的替身。由于我需要将一个可空变量转换为具有精确设置数字的字符串,所以我使用的是.ToString(format)
方法。当我将此方法应用于上述可空变量而不是根据我的需要得到转换的数字时,我只得到这个数字的第一个数字(例如给出了下面的例子)。当然,我可以将空值转换成双倍,它可以解决这个问题,但是为什么会这样呢?非常感谢您的投入。
示例:
'Nullable Double
Dim value As Double? = 867
Dim convertedValue As String = value.ToString("0.00000")
Console.WriteLine(convertedValue)
'Output: 8
'Not nullable Double
Dim value As Double = 867
Dim convertedValue As String = value.ToString("0.00000")
Console.WriteLine(convertedValue)
'Output: 867.00000
发布于 2020-11-26 00:16:37
你要调用的方法根本不存在。Double?
实际上是Nullable(Of Double)
。您调用的任何方法都必须是Nullable(Of T)
结构的成员。当ToString
可以是非数字类型时,该类型怎么会有一个以数字格式字符串作为参数的T
重载?下面是Nullable(Of T).ToString
方法的文档:
https://learn.microsoft.com/en-au/dotnet/api/system.nullable-1.tostring?view=net-5.0
如您所见,不存在这样的重载,与Double
类型不同:
https://learn.microsoft.com/en-au/dotnet/api/system.double.tostring?view=net-5.0
如果要使用数字格式字符串,则需要一个数字,而Double?
不是数字。下面是一种方法,如果它是数字,则可以使用它将值格式化为数字,而通常情况下是这样:
Private Function FormatNullableDouble(number As Double?, format As String) As String
Return If(number.HasValue,
number.Value.ToString(format),
number.ToString())
End Function
你可以这样说:
Dim convertedValue As String = FormatNullableDouble(value, "0.00000")
EDIIT:
要明确的是,因为您有Option Strict Off
,编译器忽略了您的代码没有意义,并假设它在运行时会这样做。当运行时到来时,系统会尽最大努力找到一种使其工作的方法。它真正得出的结论是:
value.ToString("0.00000")
实际上指的是:
value.ToString().Chars(CInt("0.00000"))
在VB中,如果没有参数,可以省略方法调用中的括号,因此如下所示:
value.ToString
相当于:
value.ToString()
假设您省略了括号,系统就可以使ToString
调用有意义,因此它可以做到这一点。
现在,它只需要对括号中的格式字符串做一些事情。前面的ToString
调用返回一个String
,您可以索引一个String
以在该索引上得到一个Char
值,所以它假设这就是您要做的。它将格式字符串转换为Integer
,然后从索引处的String
获取Char
。这就是为什么值为867会产生8作为输出。您正在将数字867转换为String
,然后将String
"0.00000"
转换为Integer
以获取0,然后从String
"867"
(即"8"c
)获取索引0处的Char
。
这一切之所以发生,是因为您没有打开Option Strict On
,它告诉系统尽最大努力使坏代码正常工作。
https://stackoverflow.com/questions/65014376
复制相似问题