2

我有一个用 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# 显式运算符?

4

1 回答 1

3
   DateTime^ dt = (DateTime^)jdate;

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

示例 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;
}

糟糕,我是倒着做的。反正你懂这个意思。

于 2015-02-10T09:44:10.880 回答