2

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# の明示的な演算子をサポートしていないのでしょうか?

4

1 に答える 1

3
   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;
}

おっと、逆さまにしました。さて、あなたはその考えを理解します。

于 2015-02-10T09:44:10.880 に答える