问题
In the C++/CLI project I have the method void DoSomething(long x);. If I want to use it in any unit-test written in C#, the method parameter x shows up as type int.
Why do I have to change the signature to void DoSomething(long long x); to use it with parameters of type long in my unit-tests (C#)?
回答1:
In C# long is a 64 bit data type. In C++ All we know about long is that it has to hold as much or more than an int and it is at least 32 bits. If you use a long long in c++ that is guaranteed to be at least 64 bits which will match what you have in C#.
回答2:
long is a keyword both in C# and C++. They simply don't mean the same thing. The C++/CLI designers went for the C++ interpretation since C++ was the target interop language.
Not exactly the only unintuitive mapping:
- C# byte => C++/CLI unsigned char
- C# sbyte => C++/CLI char
- C# char => 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# string => no equivalent, use System::String^
- C# decimal => no equivalent, use System::Decimal
- C# object => no equivalent, use System::Object^
- C# enum => C++/CLI public enum class
- C# struct => C++/CLI value struct
- C# class => C++/CLI ref class
- C# interface => C++/CLI interface class
- C# nullable types with ? => no equivalent, use Nullable<>
Beware the required public keyword for an enum, a necessary evil since C++11 adopted the enum class syntax.
Only the void, bool, short, int, float and double keywords match.
来源:https://stackoverflow.com/questions/33523478/what-is-the-difference-between-type-long-in-c-cli-and-c