首页 > 解决方案 > 将 VB6 变量转换为 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 执行,它会给我一个错误?

标签: c#vb6

解决方案


正确的 C# 翻译是:

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

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

混淆的根源是 VB 和 C# 关于十六进制文字的历史差异:C# 中的 0x80000000 == 2147483648 但在 VB.NET 中没有

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


推荐阅读