English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Compartilhamento de exemplos de uso explícito e implícito no C#

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.)

Você também pode gostar