簡體   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