0

私はCLR Via C# の本を読んでいて、提供されている例を試しています。

[Serializable, StructLayout(LayoutKind.Sequential)]
public struct MyNullable<T> where T : struct
{
    private readonly  bool _hasValue ; //Should be false
    private readonly T _value; //Really should be value=default(T)

    public MyNullable(T value)
    {
        _value = value;
        _hasValue = true;
    }

    public bool HasValue {
        get { return _hasValue; }
    }

    public T Value
    {
        get
        {
            if (!_hasValue)
            {
                throw new InvalidOperationException("Nullable object must have a value");
            }
            return _value;
        }
    }

    public T GetValueOrDefault()
    {
        return _value;
    }

    public T GetValueOrDefault(T defaultValue)
    {
        return !_hasValue ? defaultValue : _value;
    }

    public override bool Equals(object obj)
    {
        if (!_hasValue) return obj == null;
        if (obj == null) return false;
        return _value.Equals(obj);
    }

    public override int GetHashCode()
    {
        return !_hasValue ? 0 : _value.GetHashCode();
    }
    public override string ToString()
    {
        return _hasValue ? _value.ToString() : "";
    }


    public static implicit operator MyNullable<T>(T value)
    {
        return new MyNullable<T>(value);
    }

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

このコードは、次のように MyNullable に null 値を割り当てることができるようになっています。

MyNullable i = null;

しかし、Visual Studioは「ソースタイプnullをターゲットタイプMyNullableに変換できません」というエラーメッセージを表示しています

public static implicit operator MyNullable(T value) と考え ました

   **public static explicit operator T(MyNullable<T> value)**

トリックを行いましたが、そうではないようです。

このコードを機能させる方法はありますか?

ありがとう。

4

1 に答える 1

1

@EricLippertが最近のブログ投稿の1つで述べているように、ユーザーコードに実装することはできません。舞台裏で起こっていることはかなりたくさんあります。

参照:http ://ericlippert.com/2012/12/20/nullable-micro-optimizations-part-one/

于 2013-02-08T20:13:22.710 に答える