12

暗黙のキャスト演算子を使用してこのクラスを指定すると、次のようになります。

public class MyDateTime
{
    public static implicit operator MyDateTime(System.Int64 encoded)
    {
        return new MyDateTime(encoded);
    }

    public MyDateTime(System.Int64 encoded)
    {
        _encoded = encoded;
    }
    System.Int64 _encoded;
}

次のことができるようになりました。

long a = 5;
MyDateTime b = a;

ただし、次のことはできません。

long f = 5;
object g = f;
MyDateTime h = g;

これにより、コンパイル時間が得られます。

タイプ 'object' を 'MyDateTime' に暗黙的に変換することはできません。

私には理にかなっています。

ここで、前の例を次のように変更します。

long f = 5;
object g = f;
MyDateTime h = (MyDateTime)g;

これはうまくコンパイルされます。今、私はランタイムを取得しますInvalidCastException:

'System.Int64' 型のオブジェクトを MyDateTime 型にキャストできません。

これは、C# の暗黙的なキャスト演算子がコンパイル時にのみ適用され、.NET ランタイムがオブジェクトを別の型に動的にキャストしようとしているときには適用されないことを示しています。

私の質問:

  1. 私は正しいですか?
  2. これを行う他の方法はありますか?

ところで、完全なアプリケーションはDelegate.DynamicInvoke()、パラメーターを受け取る関数を呼び出すために使用しているMyDateTimeもので、渡す引数の型はDynamicInvokelong です。

4

3 に答える 3

14

私は正しいですか?

はい、そうです。細かいことを言うと、「暗黙のキャスト」ではなく「ユーザー定義の暗黙の変換」と言うべきです-キャストは(ほとんど)常に明示的です。しかし、オーバーロードの解決により、実行時ではなくコンパイル時に呼び出すユーザー定義の変換が選択されるというあなたの推論は正しいです。

これを行う他の方法はありますか?

はい。C# 4 では、「オブジェクト」を「動的」と入力すると、実行時にコンパイラが再び起動され、コンパイル時の型が現在の実行時の型であるかのように、オペランドのすべての分析が再実行されます。ご想像のとおり、これは安くはありませんが、タイトなループでこれを行う場合、結果をキャッシュして再利用することについて非常に賢明です.

于 2010-01-19T00:27:35.757 に答える
-3

これは古い質問であることは知っていますが、他の誰かが同じ問題に遭遇した場合に備えて、これはコンパイルして正常に実行されます。

long f = 5;
object g = f;
MyDateTime h = g as MyDateTime;
于 2013-01-30T08:03:15.903 に答える
-4

明示的な演算子を追加するとうまくいくはずです: http://msdn.microsoft.com/en-us/library/85w54y0a(VS.80).aspx

于 2010-01-19T00:03:17.063 に答える