C++/CLI 中 C# class 的显式类型转换
explicit typecasting of a C# class in C++/CLI
我有一个用 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);
(编译,但 returns 为空)
为了安全转换,我收到以下错误:
`Error 4 error C2682: cannot use 'safe_cast' to convert from 'Solution::Common::JulianDate ^' to 'System::DateTime ^' C:\Usersa3eedi\Documents\Solution\Wrapper\Wrapper.cpp 75 Wrapper
执行显式转换的正确方法是什么?或者它不起作用的原因是因为我使用结构而不是 类?或者 C++/CLI 可能不支持 C# 显式运算符?
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;
}
哎呀,我弄反了。好吧,你明白了。
我有一个用 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);
(编译,但 returns 为空)
为了安全转换,我收到以下错误:
`Error 4 error C2682: cannot use 'safe_cast' to convert from 'Solution::Common::JulianDate ^' to 'System::DateTime ^' C:\Usersa3eedi\Documents\Solution\Wrapper\Wrapper.cpp 75 Wrapper
执行显式转换的正确方法是什么?或者它不起作用的原因是因为我使用结构而不是 类?或者 C++/CLI 可能不支持 C# 显式运算符?
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;
}
哎呀,我弄反了。好吧,你明白了。