我有一些本机C / C ++函数,我在C ++ / CLI中创建托管包装器(Visual Studio 2015)。
特别是,我的托管类型之一如下所示:
public ref class MyClass abstract : public IMyClass
{
public:
virtual void SomeMethod(ID id);
}
ID 类型定义为:
typedef unsigned long ID;
由于单元测试的目的,我想在不同的C#程序集上创建与我的包装器类型兼容的接口,我希望将它与C ++ / CLI世界分开,所以我创建了这个接口:
public interface IMyClass
{
void SomeMethod(uint id);
}
当我尝试编译托管C ++ / CLI程序集时,我收到并错误地说我应该为“ void SomeMethod(unsigned int)”提供合适的实现。
我在界面上使用了 uint 类型,因为根据此MSDN documentation, unsigned long 会转换为托管类型 System.UInt32 (uint),但似乎(相反)使用 unsigned long 来实现 uint 是不可能的。
你们之前有没有遇到过同样的问题?你知道怎么解决这个问题吗? 是否可以告诉C ++ / CLI编译器我的unsigned long应该被视为uint类型?
我无法更改ID定义,因为它是本机库的一部分,并被其他功能广泛使用。
答案 0 :(得分:0)
我建议您在任何地方使用System::UInt32
:定义接口类型时以及实现它时。这将消除定义和定义之间的任何微妙的不匹配。实施。
在C ++版本中,int
和long
是不同的类型,即使它们的大小相同。实现接口时,参数类型必须完全匹配,并且看起来32位int
和32位long
之间的细微差别会有所不同。