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

时间:2011-12-23 12:32:54

标签: c# .net c++-cli nullable

我有一个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。我可以离开演员并继续前进,还是我做错了什么?

1 个答案:

答案 0 :(得分:6)

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

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

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