我有一个" 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#显式运算符?
答案 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;
}
哎呀,我倒退了。好吧,你明白了。