English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
اليوم بينما كنت أراجع مشروع قديم، رأيت كود غريب.
إذا كان dto.Payment = null، فاستمر. تعريف 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 and explicit是一对转换操作符。
Implicit and Explicit
Implicit
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 منع محول التجميع من إجراء تحويلات محتملة لتوليد نتائج غير متوقعة
الذي هو أكثر سهولة في الاستخدام، والذي يمكن أن يوضح بشكل واضح لكل شخص يقرأ الكود أنك تريد تحويل النوع
هذا هو كل محتوى نحن قد جمعناه بالنسبة لكم حول استخدامات Explicit وImplicit في C#، يمكن أن تشاهدوا أمثلة متعددة أثناء الدراسة، شكرًا لدعمك لتعليمات النفخ.
البيان: محتوى هذا المقال تم جمعه من الإنترنت، ويتمتع المالك الأصلي بحقوق الطبع والنشر، ويتم جمع المحتوى من قبل المستخدمين عبر الإنترنت الذين يقدمون المساهمات بشكل تلقائي ويتم تحميله، ويتمتع الموقع بعدم امتلاك حقوق الملكية، ولا يتم تعديل المحتوى بشكل يدوي، ولا يتحمل الموقع أي مسؤولية قانونية ذات صلة. إذا اكتشفت محتوى يشتبه في انتهاك حقوق النسخ، فلا تتردد في إرسال بريد إلكتروني إلى: notice#oldtoolbag.com (عند إرسال البريد الإلكتروني، يرجى استبدال # بـ @) لإبلاغنا، وقدم الدليل على الدليل، وسيتم حذف المحتوى المشتبه في انتهاك حقوق النسخ على الفور.