繁体   English   中英

何时在 C# 中使用隐式和显式运算符

[英]When to use implicit and explicit operators in C#

编写隐式和显式类型转换运算符很简单。

我可以找到很多关于如何编写它们的文档,但关于何时为什么编写它们的文档却很少。

我对现有的实现做了一些调查; 例如,来自 .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的那样。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM