不能隐式转换类型'System.ValueType'& # 39; int ? & # 39;

本文关键字:int ValueType 不能 转换 System 类型 | 更新日期: 2023-09-27 18:18:45

我有一个c++/CLI包装器类,可以在c#和本地c++之间进行互操作。我得到了一个与System.Nullable有关的奇怪错误。我知道,对于基本类型,System.Nullable<T>等于T?。所以我这样做:

c#:

public int? RoboticsArmRotation {
   get { return mRobotics.ArmRotation; }
}

c++/CLI接口:

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?解决了这个问题,但让我感到困扰的是,当我将空值定义为引用时,它说的是System.ValueType。我能离开剧组继续生活吗,还是我做错了什么?

不能隐式转换类型'System.ValueType'& # 39; int ? & # 39;

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

对于可空值来说,这比普通值类型更没有意义,因为可空值被装箱作为其底层类型。

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