English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Hoy, mientras revisaba un proyecto antiguo, vi un código extraño.
if (dto.Payment == null) continue; var entity = entries.FirstOrDefault(e => e.LedgerEntryID == dto.LedgerEntryID); dto.Payment = entity?.Payment;
Donde dto.Payment es una instancia de la clase PaymentDTO, entity?.Payment es una instancia de Payment, PaymentDTO y Payment no tienen relación de subclase y superclase, por lo que no existe conversión implícita entre subclase y superclase.
es raro que el compilador de Visual Studio no indique ningún error de compilación.
al abrir la definición de PaymentDTO, encontré la siguiente firma de método.
public static implicit operator PaymentDTO(Payment payment)
a primera vista, parece que se está sobrescribiendo el operador de PaymentDTO, pero no es el que uso habitualmente+,-,*,/, ==, etc.
después de consultar MSDN, me enteré de que implicit y explicit son un par de operadores de conversión.
Implicit y Explicit
Implicit
La palabra clave Implicit se utiliza para declarar operadores de conversión de tipo definidos por el usuario implícitos. Puede implementar2distintas conversiones implícitas entre clases diferentes, mejorando la legibilidad del código. Sin embargo, se debe tener en cuenta que después de usar el operador de conversión implícito, se saltará la comprobación de excepciones en tiempo de compilación, por lo que el operador de conversión implícito debe no lanzar excepciones y no perder información, de lo contrario, en tiempo de ejecución pueden aparecer algunos problemas inesperados.
por ejemplo, la definición actual de PaymentDTO y Payment es la siguiente
public class Payment { public decimal Amount { get; set; } } public class PaymentDTO { public string AmountString { get; set; } }
si es necesario convertir Payment implícitamente a PaymentDTO, solo se debe declarar el operador de conversión implícito de PaymentDTO
public class PaymentDTO { public string AmountString { get; set; } public static implicit operator PaymentDTO(Payment payment) { devolver new PaymentDTO { AmountString = payment.Amount.ToString("C",2") }; } }
al llamarlo, solo se necesita asignar directamente
class Program { static void Main(string[] args) { PaymentDTO dto = new Payment { Amount = 1 }; Console.WriteLine(dto.AmountString); Console.Read(); } }
Explicit
La palabra clave Explicit se utiliza para declarar operadores de conversión de tipo definidos por el usuario que deben ser llamados mediante conversión. A diferencia de la conversión implícita, el operador de conversión explícito debe ser llamado mediante conversión; si falta la conversión explícita, se producirá un error en tiempo de compilación.
por ejemplo, ahora cambiaremos la operador de conversión definido anteriormente en PaymentDTO de Implicito a Explícito
public class PaymentDTO { public string AmountString { get; set; } public static explicit operator PaymentDTO(Payment payment) { devolver new PaymentDTO { AmountString = payment.Amount.ToString("C",2") }; } }
En este momento, ya que el método Main no realiza una conversión explícita, el compilador lanza un error, indicando que no se puede convertir implícitamente el tipo 'ExplicitImplicit.Payment' a 'ExplicitImplicit.PaymentDTO'. Existe una conversión explícita (¿le falta una conversión de tipo?)63;)
Para que el compilador pueda compilar, solo necesita hacer una conversión explícita
class Program { static void Main(string[] args) { PaymentDTO dto = (PaymentDTO)new Payment { Amount = 1 }; Console.WriteLine(dto.AmountString); Console.Read(); } }
Resumen
El implícito mejora la legibilidad del código, pero los programadores deben garantizar por su propia cuenta que la conversión no provoque excepciones ni pierda información
El explícito puede evitar que el compilador realice conversiones que pueden tener consecuencias inesperadas en silencio
El primero es más fácil de usar, y el segundo puede indicar claramente a todos los que lean el código que desea convertir el tipo
Aquí está todo el contenido que hemos organizado sobre el uso explícito e implícito en C#, puede referirse a los ejemplos cuando aprenda, y agradecemos su apoyo a la tutorial de gritos.
Declaración: El contenido de este artículo se ha obtenido de la red, y los derechos de autor pertenecen al propietario original. El contenido ha sido contribuido y subido por usuarios de Internet de manera autónoma. Este sitio no posee los derechos de propiedad, no ha sido editado por humanos y no asume responsabilidad alguna por ellas. Si encuentra contenido sospechoso de infracción de derechos de autor, le invitamos a enviar un correo electrónico a: notice#oldtoolbag.com (al enviar un correo electrónico, reemplace # con @ para denunciar, y proporcione evidencia relevante. Una vez verificada, este sitio eliminará inmediatamente el contenido sospechoso de infracción de derechos de autor.)