c# - C++/CLI 中 C# 类的显式类型转换

标签 c# .net struct c++-cli explicit-conversion

我有一个用 C# 编写的“JulianDate”结构,它有一个来自 .NET 库的 DateTime 自定义显式运算符。我已经在我的 C# 代码中多次使用过这个显式运算符,并且它的工作没有任何问题。

我现在想在我的 C++/CLI 代码中使用相同的显式运算符,但我不知道如何操作。

我已经尝试过:

  • DateTime^ dt = (DateTime^)jdate; (编译,但我得到一个 InvalidCastException)
  • DateTime^ dt = safe_cast<DateTime^>(jdate); (我收到编译器错误)
  • DateTime^ dt = DateTime(*jdate); (编译,但 dt 的数据错误:1/1/0001 12:00AM)
  • DateTime^ dt = dynamic_cast<DateTime^>(jdate); (编译,但返回 null)

为了安全转换,我收到以下错误:

`Error  4   error C2682: cannot use 'safe_cast' to convert from 'Solution::Common::JulianDate ^' to 'System::DateTime ^'    C:\Users\9a3eedi\Documents\Solution\Wrapper\Wrapper.cpp 75   Wrapper

执行显式转换的正确方法是什么?或者它不起作用的原因是由于我使用结构而不是类?或者也许 C++/CLI 不支持 C# 显式运算符?

最佳答案

   DateTime^ dt = (DateTime^)jdate;

在 C++/CLI 中了解何时使用 ^ 帽子非常重要。这就是您在这里遇到的问题,DateTime 是一种值类型,该类型的变量不应该被声明为引用。就像您永远不会写 int^ i = 42; 一样。有点遗憾的是编译器无论如何都会接受它,它会生成一个装箱值。 99.9% 的情况不是您想要的,拳击并不是免费的。当你尝试在 Actor 中使用它时,你会挖一个更深的洞。

示例 C# 代码:

namespace ClassLibrary45
{
    public struct Julian {
        public static explicit operator Julian(DateTime rhs) {
            return new Julian();
        }
    }
}

在示例 C++/CLI 代码中使用:

using namespace System;
using namespace ClassLibrary45;

int main(array<System::String ^> ^args)
{
    DateTime dt = DateTime::Now;
    Julian j = (Julian)dt;
    return 0;
}

哎呀,我搞反了。好吧,你明白了。

关于c# - C++/CLI 中 C# 类的显式类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28428117/

相关文章:

c# - MS Entity Framework VS NHibernate 及其派生贡献(FluentNHibernate、Linq for NHibernate)

c# - 如何检查用户是否属于某个广告组?

c# - 异步/等待、ThreadPool 和 SetApartmentState

c# - 为任意一组键(任意数据类型)获取可散列对象的最有效方法

C:将嵌套结构数组传递给函数

c - 访问结构成员时出现段错误

c# - 如何在 JavaScript 中的复选框 checkin 上启用和禁用 Ajax 评级控制

c# - Visual Studio 2015 上缺少引用错误

c# - ImmutableDictionary 枚举顺序

c# - 在 C# 中使用 enum 和 struct 代替 switch 语句