自定义Nullable结构

时间:2013-02-08 20:07:52

标签: c# clr

我正在阅读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指定一个空值为

MyNullable i = null;

但Visual Studio给出了错误消息 “无法将源类型null转换为目标类型MyNullable”

我想        公共静态隐式运算符MyNullable(T值)

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

诀窍但似乎并非如此。

有没有办法让这段代码有效?

感谢。

1 个答案:

答案 0 :(得分:1)

正如@EricLippert在他最近的一篇博客文章中所述,无法在用户代码中实现。幕后发生了不少事情。

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