将VB.NET转换为C#的奇怪警告 - 十六进制常量

时间:2012-07-10 21:04:11

标签: c# vb.net warnings vb.net-to-c#

除非我使用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
            }
        }

4 个答案:

答案 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 - 查看问题的选择答案

在我标记答案之前,我想听听其他人的回复。