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

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

我有一个 C++/CLI 包装类,用于在 C# 和 native 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?解决了它,但让我烦恼的是它说 System.ValueType当我将可为空定义为引用时。我可以离开 Actor 阵容并继续前进吗?还是我做错了什么?

最佳答案

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

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

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

关于c# - 无法将类型 'System.ValueType' 隐式转换为 'int?',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8616124/

相关文章:

.net - WF4 - 重新托管的工作流设计器 - 主机可以在设计时向事件公开服务/数据吗?

c++-cli - 无法在非托管代码错误 c3265、c2811 中使用托管事件/对象

c# - C++/CLI 全局函数可访问性问题

c# - LINQ 使用 where 子句循环访问 C# 中的不同数组

c# - 来自后台 worker 的文本框文本?

c# - Amazon S3 通过 .NET SDK 创建文件夹与通过管理控制台

.net - 在 FontDialog 中显示颜色选项,没有下划线和删除线选项

c++ - 无法从 const char[] 转换为 std :string *

c# - 在 ASP.NET 中从数据库中的 Div 中显示图像

c# - 使用 SqlBulkCopy 插入 GUID