我有一个C ++ / CLI包装类,用于在C#和本机C ++之间进行交互。我收到与System.Nullable
相关的奇怪错误。我了解到,对于基本类型,System.Nullable<T>
相当于T?
。所以我这样做:
C#:
public int? RoboticsArmRotation {
get { return mRobotics.ArmRotation; }
}
C ++ / CLI,interface:
virtual property System::Nullable<int>^ ArmRotation{ System::Nullable<int>^ get() = 0; }
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>();
}
}
但是我得到了标题的编译错误。转换为int?
可以解决它,但是当我将可以为空的nullable定义为引用时,我会说System.ValueType
。我可以离开演员并继续前进,还是我做错了什么?
答案 0 :(得分:6)
您正在使用Nullable<int>^
作为参考。由于运行时不直接支持具有值类型的引用,因此IL级别的实际类型为ValueType
,以C ++ / CLI支持的方式标记为Nullable<int>^
,但C#不支持。对于C#,它只是输入System.ValueType
。
这对于nullables而言比对普通值类型更有意义,因为nullables被列为基础类型。
我建议不要在C ++中将该字段声明为引用,而是使用简单的Nullable<int>
。