我如何实现一个结构,以便可以执行以下转换?
var a = new StatusedValue<double>(1, false);
var b = (StatusedValue<int>)a;
我的实现应类似于Nullable<T>
,其工作方式正常。但是,此代码失败并显示System.InvalidCastException
:
public struct StatusedValue<T> where T : struct
{
public StatusedValue(T value) : this(value, true)
{
}
public StatusedValue(T value, bool isValid)
{
this.value = value;
this.isValid = isValid;
}
private T value;
private bool isValid;
public static implicit operator StatusedValue<T>(T value)
{
return new StatusedValue<T>(value);
}
public static explicit operator T(StatusedValue<T> value)
{
return value.value;
}
}
结果:
无法将类型为“ StatusedValue`1 [System.Double]”的对象强制转换为类型为“ StatusedValue`1 [System.Int32]”的对象。
这对Nullable<T>
类型有效,因为它们会从编译器中得到特殊处理。这称为“提升转换运算符”,您无法定义自己的运算符。
从C#规范的6.4.2节开始:
6.4.2提升转换运算符
给定一个用户定义的转换运算符,该运算符从非空值类型S转换为非空值类型T,存在一个从S?转换的提升转换运算符。到T?。此提升的转换运算符从S?解开吗?到S,然后是用户定义的从S到T的转换,然后是从T到T?的换行,只是空值S?直接转换为零值T?。提升的转换运算符与其基础的用户定义转换运算符具有相同的隐式或显式分类。术语“用户定义的转换”适用于用户定义的转换操作和提升转换操作符的使用
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句