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 分配一个空值

MyNullable i = null;

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

我认为 公共静态隐式运算符 MyNullable(T value)

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

成功了,但似乎并非如此。

有什么办法可以让这段代码工作吗?

谢谢。

4

1 回答 1

1

正如@EricLippert 在他最近的一篇博客文章中所说,不可能在用户代码中实现。幕后发生了很多事情。

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

于 2013-02-08T20:13:22.710 回答