我正在阅读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)**
诀窍但似乎并非如此。
有没有办法让这段代码有效?
感谢。
答案 0 :(得分:1)
正如@EricLippert在他最近的一篇博客文章中所述,无法在用户代码中实现。幕后发生了不少事情。
请参阅:http://ericlippert.com/2012/12/20/nullable-micro-optimizations-part-one/