C++/CLI 和 C# 中的类型 "long" 有什么区别?

What is the difference between type "long" in C++/CLI and C#?

C++/CLI 项目中,我有方法 void DoSomething(long x);。如果我想在用 C# 编写的任何单元测试中使用它,方法参数 x 显示为类型 int.

为什么我必须将签名更改为 void DoSomething(long long x); 才能在我的单元测试 (C#) 中将其与 long 类型的参数一起使用?

在 C# 中 long 是 64 位数据类型。在 C++ 中,我们对 long 的了解是它必须包含与 int 一样多或更多的内容,并且它至少为 32 位。如果您在 C++ 中使用 long long,保证至少为 64 位,这将匹配您在 C# 中的内容。

long 是 C# 和 C++ 中的关键字。他们根本不是同一件事。 C++/CLI 设计者选择了 C++ 解释,因为 C++ 是目标互操作语言。

不完全是唯一不直观的映射:

  • C# 字节 => C++/CLI 无符号字符
  • C# sbyte => C++/CLI 字符
  • C# 字符 => C++/CLI wchar_t
  • C# ushort => C++/CLI unsigned short
  • C# uint => C++/CLI unsigned int
  • C# long => C++/CLI long long
  • C# ulong => C++/CLI unsigned long long
  • C# 字符串 => 没有等效项,使用 System::String^
  • C# 十进制 => 没有等效项,使用 System::Decimal
  • C# 对象 => 没有等价物,使用 System::Object^
  • C# 枚举 => C++/CLI public 枚举 class
  • C# 结构 => C++/CLI 值结构
  • C# class => C++/CLI 参考 class
  • C# 接口 => C++/CLI 接口 class
  • 带有 ? 的 C# 可空类型=> 没有等价物,使用 Nullable<>

注意枚举所需的 public 关键字,这是自 C++11 采用 enum class 语法以来必不可少的邪恶。

只有 void、bool、short、int、float 和 double 关键字匹配。