私は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)**
トリックを行いましたが、そうではないようです。
このコードを機能させる方法はありますか?
ありがとう。