C#中的Explicit和Implicit

來源:互聯網
上載者:User

標籤:父類   代碼   常用   出錯   sts   sdn   關鍵字   自己   new   

今天在Review一個老項目的時候,看到一段奇怪的代碼。

 

if (dto.Payment == null) continue;var entity = entries.FirstOrDefault(e => e.LedgerEntryID == dto.LedgerEntryID);dto.Payment = entity?.Payment;

 

其中dto.Payment是一個PaymentDTO類的執行個體,entity?.Payment是一個Payment類的執行個體,PaymentDTO類和Payment類沒有子父關係,所以不存在子類和父類之間的隱式轉換。

奇怪的是Visual Studio的編譯器沒有提示任何編譯錯誤。

開啟PaymentDTO類的定義之後,發現了以下方法簽名。

 

    public static implicit operator PaymentDTO(Payment payment)

 

從方法簽名上看,這就是重寫PaymentDTO類型的操作符,但並不是我以前常用的+,-,*,/, ==等。

查詢MSDN之後,才瞭解到implicit和explicit是一對轉換操作符。

 

Implicit和ExplicitImplicit

Implicit關鍵字用於聲明隱式的使用者定義型別轉換運算子。它可以實現2個不同類的隱式轉換 ,提高代碼的可讀性。但是需要注意使用隱式轉換操作符之後,在編譯時間會跳過異常檢查,所以隱式轉換運算子應當從不引發異常並且從不丟失資訊,否則在運行時會出現一些意想不到的問題。

 

例如當前PaymentDTO和Payment的定義如下

 

    public class Payment    {         public decimal Amount { get; set; }    }     public class PaymentDTO    {         public string AmountString { get; set; }    }

 

如果需要將Payment隱式轉換成PaymentDTO, 僅需聲明PaymentDTO的隱式轉換運算子

        public class PaymentDTO        {            public string AmountString { get; set; }             public static implicit operator PaymentDTO(Payment payment)            {                return new PaymentDTO                {                    AmountString = payment.Amount.ToString("C2")                };            }        }

 

調用時只需要直接賦值就可以

        class Program        {            static void Main(string[] args)            {                PaymentDTO dto = new Payment { Amount = 1 };                 Console.WriteLine(dto.AmountString);                Console.Read();            }        }

 

Explicit

Explicit關鍵字聲明必須通過轉換來調用的使用者定義的類型轉換運算子。不同於隱式轉換,顯式轉換運算子必須通過轉換的方式來調用,如果缺少了顯式的轉換,在編譯時間就會產生錯誤。

 

例如現在我們將前面PaymentDTO類中定義的轉換操作符從Implicit變為Explicit

 

        public class PaymentDTO        {            public string AmountString { get; set; }             public static explicit operator PaymentDTO(Payment payment)            {                return new PaymentDTO                {                    AmountString = payment.Amount.ToString("C2")                };            }        }

 

 

這時候由於Main方法中沒有顯式轉換,所以編譯器出錯,提示Cannot implicitly convert type ‘ExplicitImplicit.Payment‘ to ‘ExplicitImplicit.PaymentDTO‘. An explicit conversion exists (are you missing a cast?)

 

 

 

如果想要編譯器通過編譯, 只需要做一個顯示轉換即可

        class Program        {            static void Main(string[] args)            {                PaymentDTO dto = (PaymentDTO)new Payment { Amount = 1 };                 Console.WriteLine(dto.AmountString);                Console.Read();            }        }

 

總結
  • Implicit提高了代碼的可讀性,但程式員需要自己保證轉換不引發異常且不丟失資訊
  • Explicit可阻止編譯器靜默調用可能產生意外後果的轉換操作。
  • 前者更便於使用,後者能向閱讀代碼的每個人清楚地指示您要轉換類型

C#中的Explicit和Implicit

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.