无法将类型'System.ValueType'隐式转换为'int?'

dar*_*mos 2 .net c# nullable c++-cli

我有一个C++/CLI包装类,用于在C#和本机C++之间进行交互.我得到一个与之相关的奇怪错误System.Nullable.我理解,对于基本类型,System.Nullable<T>相当于T?.所以我这样做:

C#:

public int? RoboticsArmRotation {
   get { return mRobotics.ArmRotation; }
}
Run Code Online (Sandbox Code Playgroud)

C++/CLI,界面:

virtual property System::Nullable<int>^ ArmRotation{ System::Nullable<int>^ get() = 0; }
Run Code Online (Sandbox Code Playgroud)

C++/CLI,具体类:

virtual property System::Nullable<int>^ ArmRotation {
    System::Nullable<int>^ get() {
        boost::optional<int> value = m_pNativeInstance->getArmRotation();
        return value.is_initialized()? gcnew System::Nullable<int>(value.get()) : gcnew System::Nullable<int>();
    }
}
Run Code Online (Sandbox Code Playgroud)

但我得到了标题的编译错误.为了int?解决它而进行的转换,但是System.ValueType当我将可以为空的nullable定义为引用时,它就是我所说的.我可以离开演员并继续前进,还是我做错了什么?

Cod*_*aos 6

你正在使用Nullable<int>^哪个是参考.由于运行时不直接支持具有值类型的引用,因此IL级别的实际类型是以C++/CLI支持的方式ValueType标记的Nullable<int>^,但C#不支持.对于C#,它只是键入为System.ValueType.

这对于nullables而言比对普通值类型更有意义,因为nullables被列为基础类型.

我建议不要在C++中将该字段声明为引用,而是使用简单的引用Nullable<int>.