c# - 将 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# 翻译是:
const int GENERIC_READ = unchecked((int)0x80000000);
在 VB 中,'GENERIC_READ' 隐含地是一个具有负值的整数。在 C# 中重现这一点的唯一方法是在未经检查的上下文中将无符号整数文字转换为 int。
混淆的根源是 VB 和 C# 关于十六进制文字的历史差异:C# 中的 0x80000000 == 2147483648 但在 VB.NET 中没有
在文字上没有类型后缀的情况下,VB.NET 中的十六进制文字要么是 Integer 类型,要么是 Long 类型,绝不是无符号类型。
推荐阅读
- envoyproxy - 禁用特使代理上的扩展
- python - 我想在python代码中实现与.Net变量的交互。有没有办法替换pythonnet的scope.Set() scope.Get()?
- julia - MethodError:没有方法匹配 Lagrange_Polynomials
- audio - Ffmpeg:在生成的电影中交替音频语言以进行语言学习
- c++ - 如何在 cmake 中启用`/std:c++latest`?
- javascript - “#document”类型的节点不能插入“HEAD”类型的节点内
- javascript - 如何从这个 api 中选择我需要的数据?
- angular - chartOptions.redraw 不是使用角度的 highcharts 中的函数
- ios - SwiftUI 中的 AVSampleBufferDisplayLayer 在 UIViewRepresentable
- elasticsearch - 如何从别名或索引名称中获取索引类型?