English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Hoje, ao revisar um projeto antigo, vi um código estranho.
if (dto.Payment == null) continue; var entity = entries.FirstOrDefault(e => e.LedgerEntryID == dto.LedgerEntryID); dto.Payment = entity?.Payment;
O dto.Payment é uma instância da classe PaymentDTO, entity?.Payment é uma instância da classe Payment, a classe PaymentDTO e a classe Payment não têm relação de herança, portanto, não existe conversão implícita entre subclasses e superclasse.
estranhamente, o compilador do Visual Studio não sinalizou nenhum erro de compilação.
ao abrir a definição da classe PaymentDTO, encontrei a seguinte assinatura de método.
public static implicit operator PaymentDTO(Payment payment)
aparentemente, de acordo com a assinatura do método, isso é a sobrescrita do operador do tipo PaymentDTO, mas não é o que uso habitualmente+,-,*,/, == etc.
após consultar o MSDN, aprendi que implicit e explicit são um par de operadores de conversão.
Implicit e Explicit
Implicit
A palavra-chave Implicit declara um operador de conversão de tipo definido pelo usuário implícito. Ele pode implementar2a conversão implícita entre classes diferentes, melhorando a legibilidade do código. No entanto, deve-se notar que após a utilização do operador de conversão implícito, o compilador pula a verificação de exceções, portanto, o operador de conversão implícito deve nunca lançar exceções e nunca perder informações; caso contrário, podem ocorrer problemas inesperados em tempo de execução.
por exemplo, as definições atuais de PaymentDTO e Payment são as seguintes
public class Payment { public decimal Amount { get; set; } } public class PaymentDTO { public string AmountString { get; set; } }
se precisar converter Payment implicitamente para PaymentDTO, basta declarar o operador de conversão implícito de PaymentDTO
public class PaymentDTO { public string AmountString { get; set; } public static implicit operator PaymentDTO(Payment payment) { retornar new PaymentDTO { AmountString = payment.Amount.ToString("C",2") }; } }
ao chamar, basta atribuir diretamente
class Program { static void Main(string[] args) { PaymentDTO dto = new Payment { Amount = 1 }; Console.WriteLine(dto.AmountString); Console.Read(); } }
Explicit
A palavra-chave Explicit declara um operador de conversão de tipo definido pelo usuário que deve ser chamado através de conversão. Diferente da conversão implícita, o operador de conversão explícito deve ser chamado através de conversão; se falta a conversão explícita, ocorrerá um erro ao compilar.
por exemplo, agora vamos mudar a operação de conversão definida anteriormente no PaymentDTO para Explicit
public class PaymentDTO { public string AmountString { get; set; } public static explicit operator PaymentDTO(Payment payment) { retornar new PaymentDTO { AmountString = payment.Amount.ToString("C",2") }; } }
Neste momento, devido à ausência de conversão explícita no método Main, o compilador gera um erro, indicando Cannot implicitly convert type 'ExplicitImplicit.Payment' to 'ExplicitImplicit.PaymentDTO'. An explicit conversion exists (are you missing a cast?63;)
Para que o compilador possa compilar, é necessário fazer uma conversão explícita
class Program { static void Main(string[] args) { PaymentDTO dto = (PaymentDTO)new Payment { Amount = 1 }; Console.WriteLine(dto.AmountString); Console.Read(); } }
Resumo
O implícito melhora a legibilidade do código, mas os programadores precisam garantir que a conversão não gere exceções e não perca informações
O explícito pode evitar que o compilador chame silenciosamente operações de conversão que podem gerar consequências inesperadas.
O primeiro é mais fácil de usar, o segundo pode claramente indicar a todos os leitores do código que você deseja converter o tipo
Aquilo é tudo o que organizamos sobre o uso explícito e implícito em C#, ao aprender, você pode referenciar muitos exemplos, obrigado pelo seu apoio ao tutorial Gritar.
Declaração: O conteúdo deste artigo é extraído da Internet, pertence ao autor original, foi contribuído e carregado pelos usuários da Internet, este site não possui direitos de propriedade, não foi editado manualmente e não assume responsabilidade por eventuais responsabilidades legais. Se você encontrar conteúdo suspeito de infringência de direitos autorais, seja bem-vindo a enviar e-mail para: notice#oldtoolbag.com (ao enviar e-mail, substitua # por @ para denunciar e forneça provas relevantes. Apenas após a verificação, o site deletará o conteúdo suspeito de infringência de direitos autorais.)