1

除非我使用 HTML,否则我通常不会处理十六进制数字,因此我真的没有太多转换涉及它们的代码的经验。本质上,这里的问题是我正在将一些类从 VB.NET 转换为 C#.NET,并且有几个地方 VB 版本将一些值与十六进制常量进行比较。当我将该值转换为其 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

4 回答 4

3

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

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

于 2012-07-10T21:10:17.933 回答
3

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

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

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

当 8 个十六进制数字非常适合 32 位 ( System.Int32) 时,这很烦人。

于 2012-07-10T22:00:34.740 回答
2

COMException::ErrorCode 是 int32 类型。所以它的最大值是 2^31 - 1. (2,147,483,647)。

您正在与十六进制数 0x80042776 进行比较。十进制值为 2,147,755,894。

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

魔法十六进制常数从何而来?很可能是错的。

于 2012-07-10T21:10:41.910 回答
0

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

我在这里看到了详细的堆栈溢出帖子: Catching COMException specific Error Code - 查看选择的问题答案

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

于 2012-07-10T21:30:13.807 回答