Явное приведение типов C# класса в C++/CLI

У меня есть структура "JulianDate", которую я написал на C#, и у нее есть собственный явный оператор DateTime из библиотеки.NET. Я использовал этот явный оператор несколько раз в моем коде C#, и он работает без проблем.

Теперь я хочу использовать тот же явный оператор в своем коде C++/CLI, но я не могу понять, как.

Я пробовал:

  • DateTime^ dt = (DateTime^)jdate; (компилируется, но я получаю InvalidCastException)
  • DateTime^ dt = safe_cast<DateTime^>(jdate); (Я получаю ошибку компилятора)
  • DateTime^ dt = DateTime(*jdate); (компилируется, но у dt неверные данные: 01.01.01 00:00)
  • DateTime^ dt = dynamic_cast<DateTime^>(jdate); (компилируется, но возвращает ноль)

Для безопасного приведения я получаю следующую ошибку:

`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 ответ

Решение
   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;
}

Ой, я сделал это задом наперед. Ну, вы поняли.

Другие вопросы по тегам