【问题标题】:explicit typecasting of a C# class in C++/CLIC++/CLI 中 C# 类的显式类型转换
【发布时间】:2015-02-10 09:26:49
【问题描述】:

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

【问题讨论】:

  • 只是为了赶走鬼魂,我会做一个成员函数,它返回你想要的东西,看看它是否有效。如果可行,并且您有时间花在上面,您可以研究如何使演员表操作员工作。

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


【解决方案1】:
   DateTime^ dt = (DateTime^)jdate;

在 C++/CLI 中知道何时使用 ^ 帽子非常重要。这就是您在这里遇到的问题,DateTime 是一个值类型,并且该类型的变量应该 not 被声明为引用。就像你永远不会写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;
}

糟糕,我是倒着做的。好吧,你明白了。

【讨论】:

  • 啊,原来如此。我的印象是 ^ 帽子应该用于 .NET 类型,而不仅仅是引用类型。谢谢你的解释!我的代码现在可以正常工作了。
  • 是的,它应该用于 .NET 引用类型。 DateTime 是一种 .NET 类型。但不是引用类型。你最好给自己买一本书把它记下来,这很重要。
  • 我知道 DateTime 是值类型而不是引用类型。我不知道的是 ^ 基本上意味着一个变量是一个引用,不应该用于值类型。
猜你喜欢
  • 2016-06-03
  • 1970-01-01
  • 2011-07-01
  • 1970-01-01
  • 2021-12-06
  • 2017-02-14
  • 1970-01-01
  • 1970-01-01
  • 2011-12-25
相关资源
最近更新 更多