将 VB6 变量转换为 C#

Converting VB6 varables to C#

我正在转换旧的 VB6 代码并且遇到这些常量的问题:

VB6 代码:

Private Const GENERIC_WRITE = &H40000000
Private Const GENERIC_READ = &H80000000

C# 代码:

private const int GENERIC_WRITE = 0x40000000;
private const uint GENERIC_READ = 0x80000000;

为什么第二行必须是uint? 如果我用 int 来做,它会给我一个错误?

Int32的最大值为2,147,483,647,0x80000000的值为2,147,483,648,即Int32.MaxValue + 1

使用 uint(或 long)为您提供一个足够大的类型来保存您正在分配的值。

以"u"为前缀的原始数据类型是具有相同位大小的无符号版本。 实际上,这意味着它们不能存储负数,但另一方面,它们可以存储两倍于有符号数的正数。

正确的 C# 翻译是:

const int GENERIC_READ = unchecked((int)0x80000000);

在VB中,'GENERIC_READ'隐式是一个负值的整数。在 C# 中重现这一点的唯一方法是在未经检查的上下文中将无符号整数文字转换为 int。

混淆的根源是 VB 和 C# 在十六进制文字方面的历史差异: 0x80000000 == 2147483648 in C# but not in VB.NET

在文字上没有类型后缀的情况下,VB.NET 中的十六进制文字是 Integer 或 Long 类型,绝不是无符号类型。