编写隐式和显式类型转换运算符是微不足道的。
我可以找到很多关于如何编写它们的文档,但很少有关于何时或为什么[/strong>编写这些文档的文档。
我已经对现有的实现进行了一些调查;例如,.NET的参考源中的BigInteger
public struct BigInteger : IFormattable, IComparable, IComparable<BigInteger>, IEquatable<BigInteger>
{
public static implicit operator BigInteger(Byte value)
{
return new BigInteger(value);
}
public static explicit operator Byte(BigInteger value)
{
return checked((byte)((int)value));
}
}
给定上面的摘录,当从Byte
转换为BigInteger
时使用implicit
运算符,而当从BigInteger
转换为Byte
时使用explicit
运算符的合理性是什么?
正如我在评论中提到的,我的假设是隐式运算符应该始终被视为安全的,而显式运算符可能是安全的,但在某些情况下可能需要处理。
我发现了以下关于预定义隐式运算符的文档:
预定义的隐式转换总是成功的,并且从不导致要抛出的异常。
注意:正确设计的用户定义隐式转换应该也表现出这些特征。尾钞
此外,显式转换的文档没有提供相同的保证:
非隐式转换的显式转换是无法证明的转换总是成功的已知可能会丢失信息,以及跨域转换具有足够不同的类型,值得显式表示。
这清楚地支持了我的假设,即隐式运算符必须始终是安全的,并且从不需要异常处理,而显式运算符可以并且确实抛出异常,例如您的显式运算符checked
。