在C ++ / CLI中对C#类进行显式类型转换

时间:2015-02-10 09:26:50

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

我有一个" JulianDate"我用C#编写的结构,它有一个来自.NET库的DateTime的自定义显式运算符。我在C#代码中多次使用过这个显式运算符,没有问题。

我现在想在我的C ++ / CLI代码中使用相同的显式运算符,但我无法弄清楚如何。

我试过了:

  • DateTime^ dt = (DateTime^)jdate;(编译,但我收到InvalidCastException)
  • DateTime^ dt = safe_cast<DateTime^>(jdate);(我收到编译错误)
  • DateTime^ dt = DateTime(*jdate);(编译,但数据错误:1/1/0001 12:00 AM)
  • 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#显式运算符?

1 个答案:

答案 0 :(得分:3)

   DateTime^ dt = (DateTime^)jdate;

在C ++ / CLI中非常重要,知道何时使用^ hat。这是您在这里遇到的问题,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;
}
哎呀,我倒退了。好吧,你明白了。