2

のように動作するクラスを構築しようとしています。具体的には、を明示的に呼び出さなくてもクラスNullable<T>の基になる値にアクセスできる方法です。Nullable<T>nullable.Value

次の例の行では、check1&check2両方が機能します。

Nullable<DateTime> nullable = new DateTime();
bool check1 = nullable >= DateTime.Now; //Works
bool check2 = nullable.Value >= DateTime.Now; //Works

TrackedValueラップする値が変更されたかどうかを記憶する独自のクラスを作成しました。私はNullable<T>、暗黙的および明示的な演算子に基づいて構築しました。

Nullable<T>意味

public struct Nullable<T> where T : struct
{
    public Nullable(T value);

    public static explicit operator T(T? value);
    public static implicit operator T?(T value);

    ...
}

TrackedValue<T>意味

public class TrackedValue<T> : IChangeTracking
{
    ...

    T trackedValue;
    public T Value
    {
        get
        {
            return this.trackedValue;
        }
        set
        {
            this.trackedValue = value;
        }
    }

    public static explicit operator T(TrackedValue<T> value)
    {
        return value.Value;
    }

    public static implicit operator TrackedValue<T>(T value)
    {
        return new TrackedValue<T>() { Value = value };
    }
}

したがって、次のように動作することを期待していましたが、次のcheck3理由でコンパイルされません。

Argument 1: cannot convert from 'TrackedValue<System.DateTime>' to 'System.DateTime'

TrackedValue<DateTime> trackedValue = new DateTime();
bool check3 = trackedValue >= DateTime.Now; //Does not work
bool check4 = trackedValue.Value >= DateTime.Now; //Works

任意のポインタをいただければ幸いです。

4

3 に答える 3