除非我使用HTML,否则我通常不会处理十六进制数字,所以我真的没有太多经验来转换涉及它们的代码。本质上,这里的问题是我将一些类从VB.NET转换为C#.NET,并且有几个地方VB版本将某个值与Hex常量进行比较。当我将值转换为其C#等价物时,我从Visual Studio得到以下“警告”消息:
与积分常数的比较是无用的,常数在外面 'int'类型的范围
现在,显然VB版本没有这个警告,或者我不打算问这个问题。我会注意到,如果我将属性作为Int64进行比较,警告就会消失。
我想知道的是,我是否已经做到了这一点,如果我不应该废弃整个比较,因为它显然不适用于真实场景?
VB代码:
Catch ex As COMException
If bInsert AndAlso ex.ErrorCode = &H80042776 Then
' DO THINGS
End Try
C#代码:
catch (COMException come)
{
if (insert && come.ErrorCode == 0x80042776)
{
// DO THINGS
}
}
答案 0 :(得分:3)
在VB.NET中,涉及integer literals:
Integer范围之外的值键入Long
答案 1 :(得分:2)
COMException :: ErrorCode的类型为int32。所以它的最大值是2 ^ 31 - 1.(2,147,483,647)。
您正在与十六进制数字0x80042776进行比较。小数值为2,147,755,894。
这些数字非常接近,但请注意,十六进制数大于int32可能的最大数。这就是编译器警告你的内容。在VB中也是如此,只是编译器没有警告你。
魔法十六进制常量来自何处?这可能是错的。
答案 2 :(得分:2)
我不知道这是否在VB.NET中有效(不确定那里的规则),但C#不会轻易让你指定这样的负数。我想你必须说
... come.ErrorCode == unchecked((int)0x80042776)
否则C#不会将它视为负32位整数,我担心。即使你的代码已经在unchecked
上下文中编译(我敢打赌它!),你仍然需要像上面那样明确地编写unchecked
,当它是一个编译时常量你正在“转换”时
当8个十六进制数字很好地适合32位(System.Int32
)时会激怒。
答案 3 :(得分:0)
好的,所以我在这个问题上做了一些额外的搜索(可能应该先做这个),并找到了我想要的答案。事实证明,COMException的ErrorCode实际上是一个UNSIGNED整数(参见HRESULT)。也许VB会自动处理这个问题吗?
我看到堆栈溢出帖子详细信息如下:Catching COMException specific Error Code - 查看问题的选择答案
在我标记答案之前,我想听听其他人的回复。