【发布时间】:2014-02-07 03:27:49
【问题描述】:
我遇到了一个非常奇怪的问题,我的软件只有一个用户。
如标题所述,我收到以下错误:
Conversion from string "-1" to type 'Integer' is not valid.
at Microsoft.VisualBasic.CompilerServices.Conversions.ToInteger(String Value)
应用程序中的一些旧代码使用 VB 调用 GetSettings 来检索注册表信息,下面是它的签名和应用程序中的使用示例:
Public Function GetSetting(ByVal AppName As String, ByVal Section As String, ByVal Key As String, Optional ByVal Default As String = "") As String
在应用程序的旧(8 岁以上)部分中使用如下:
GetSetting("My App", "Section", "Key", "-1")
因此,如果未找到注册表项,GetSettings 将返回字符串“-1”。在代码中这主要使用如下...
Dim regValue as Integer = GetSetting("My App", "Section", "Key", "-1")
...没有任何类型的转换为整数,如 CInt(GetSetting("My App", "Section", "Key", "-1")) 等。我意识到这可能是不好的编码习惯,但是,在 VB.net 中,只要赋值有效(即 GettSetting 的默认值实际上是一个有效整数的字符串,而不是“adasd”或“”,例如)它应该可以工作(我意识到在 c# 中不是这种情况成功编译需要强制转换)。
为了进一步测试这一点,我进入了我的注册表并将所有键设置为 -1 并完全删除了所有键(以便使用默认值)并且无法重现该问题。我能够重现类似错误的唯一方法是将其中一个注册表项设置为“-1”(在键值中使用引号)并收到几乎完全相同的错误:
Conversion from string ""-1"" to type 'Integer' is not valid.
这是有道理的,但是,由于添加了引号(“-1”与“”-1””),注册表值不再是一个有效的整数。
每天有大约 3000 人使用该应用程序,除此用户外,没有其他人遇到此问题,此代码也已 8 年多未更改(新代码不再使用注册表)。
我已尝试在用户计算机上重新安装 .NET 和应用程序,以及在用户控制面板中查看任何奇怪的区域设置等,但尚未找到解决问题的方法。
任何见解将不胜感激。
谢谢!
【问题讨论】:
-
对于那个用户来说,它是否始终如一地重现,或者即使对于那个用户来说也是零星的?
-
它与用户一致,并且发生在使用 GetSettings 调用的每种形式中。肯定是头疼。
-
如果你编写一个测试应用程序,它什么都不做,只调用
Microsoft.VisualBasic.CompilerServices.Conversions.ToInteger("-1")并让该用户运行它。有这种可能吗?如果是这样,我很想知道在那种情况下会发生什么。 -
可能值得查看违规用户的区域设置中的数字格式。
-
您能否查看并查看他们计算机上以下注册表项的值:
HKEY_CURRENT_USER\Control Panel\International\sNegativeSign
标签: .net vb.net exception casting