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



除非我使用HTML,否则我通常不会处理十六进制数字,所以我真的没有太多转换涉及它们的代码的经验。从本质上讲,这里的问题是我正在将一些类从VB.NET转换为C#.NET,在一些地方,VB版本将一些值与十六进制常量进行比较。当我将该值转换为等价的C#时,我从Visual Studio得到以下"警告"消息:

与积分常数比较是无用的,常数在外面"int"类型的范围

现在,显然VB版本没有这个警告,否则我就不会问这个问题了。我要注意的是,如果我将正在比较的Property转换为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
            }
        }

我不知道这在VB.NET中是否有效(不确定那里的规则),但C#不会轻易让你指定这样的负数。我想你得说

...    come.ErrorCode == unchecked((int)0x80042776)

否则,恐怕C#不会将其视为负32位整数。即使你的代码已经在unchecked上下文中编译了(我敢打赌是这样!),你仍然必须像上面一样显式地编写unchecked,当它是一个编译时常数时,你正在"转换"它。

当8个十六进制数字很好地适合32位(System.Int32)时会很刺激。

在VB.NET中,当涉及到整数文本时:

Integer范围之外的值被键入为Long

COMException::ErrorCode的类型为int32。所以它的最大值是2^31-1。(2147483647)。

您正在与十六进制数字0x80042776进行比较。十进制值为2147755894。

这些数字非常接近,但请注意,十六进制1比int32可能的最大数字大。这就是编译器警告您的。VB中也是如此,只是编译器没有警告你

魔法十六进制常数是从哪里来的?这可能是错误的。

好的,所以我对这个问题进行了一些额外的搜索(可能应该先这样做),并找到了我想要的答案。事实证明,COMException的ErrorCode实际上是一个UNSIGNED整数(请参阅HRESULT)。也许VB也会自动处理这个问题?

我看到的堆栈溢出帖子详细介绍如下:捕获COMException特定的错误代码-查看问题的选定答案

在我给出答案之前,我想听听其他人对这个问题的反馈。

最新更新