从字符串“-1”到“Integer”类型的转换无效,但String值是有效的int

时间:2014-01-17 17:21:37

标签: .net vb.net exception casting

我遇到了一个非常奇怪的问题,我的软件只有一个用户。

如标题所述,我收到以下错误:

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(“我的应用程序”,“部分”,“密钥”,“ - 1”))等等。我意识到这可能是错误的编码实践,但是,在VB.net中,只要赋值是有效的(即GettSetting的默认值实际上是一个有效整数的字符串而不是“adasd”或“”)它应该工作(我意识到这不是c#中的情况)成功编译需要演员表。)

为了进一步测试,我已进入我的注册表并将所有键设置为-1以及完全删除所有键(以便使用默认值)并且无法重现该问题。我能够重现类似错误的唯一方法是将其中一个注册表项设置为“-1”(使用键值中的引号)并收到几乎完全相同的错误:

Conversion from string ""-1"" to type 'Integer' is not valid.

然而,这是有道理的,因为添加的引号(“-1”vs“”-1“”),注册表值不再是有效整数。

每天有大约3000人使用该应用程序,除了这一个用户之外没有其他人遇到此问题,此代码在8年以上也没有变化(较新的代码不再使用该注册表)。 / p>

我已尝试在用户计算机上重新安装.NET和应用程序,以及在用户控制面板中查找任何奇怪的区域设置等,但尚未能够找到问题的解决方案。

非常感谢任何见解。

谢谢!

1 个答案:

答案 0 :(得分:3)

Microsoft.VisualBasic.CompilerServices.Conversions.ToInteger方法使用区域设置来解析字符串。确保以下注册表项的值正确无误:HKEY_CURRENT_USER\Control Panel\International\sNegativeSign