Operador implícito estático


158

Encontrei recentemente este código:

 public static implicit operator XElement(XmlBase xmlBase)
 {
     return xmlBase.Xml;
 }

O que static implicit operatorsignifica isso ?

Respostas:


263

Este é um operador de conversão . Isso significa que você pode escrever este código:

XmlBase myBase = new XmlBase();
XElement myElement = myBase;

E o compilador não vai reclamar! Em tempo de execução, o operador de conversão será executado - passando myBasecomo argumento e retornando um válido XElementcomo resultado.

É uma maneira de você, como desenvolvedor, dizer ao compilador:

"mesmo que pareçam dois tipos totalmente independentes, na verdade existe uma maneira de converter de um para o outro; deixe-me lidar com a lógica de como fazê-lo."


11
+1. Eu acrescentaria que, embora existam bons usos ocasionais de conversão implícita, ele também pode causar erros estranhos / surpreendentes e pode confundir um usuário da API (humano). A título de exemplo, existem muito poucos usos de conversões implícitas na BCL. Use com discrição!
Drew Noakes

13

Tal um meio operador implícitas você pode converter XmlBasepara XElementimplicitamente.

XmlBase xmlBase = WhatEverGetTheXmlBase();
XElement xelement = xmlBase;   
//no explicit convert here like: XElement xelement = (XElement)xmlBase;

essa conversão explícita pode funcionar? XElement xelement = (XElement)xmlBase;Na pergunta que diz static, o que tem que ser estático? Não pode ser não estático, para ser instanciado?
aspirante

6

Outro uso interessante é (que o Unity fez para verificar se um objeto (e, portanto, uma instância do MonoBehavior) é nulo):

public static implicit operator bool (CustomClass c)
{
    return c != null;
}

Observe que o código deve estar dentro da classe (CustomClass neste caso). Dessa forma, você pode fazer algo assim:

void Method ()
{
    CustomClass c1 = null;
    CustomClass c2 = new CustomClass ();

    bool b1 = c1; // is false
    bool b2 = c2; // is true

    if (!c1 && c2)
    {
        // Do stuff
    }
}

Obviamente, o uso mais notório pode ser usá-lo para converter uma de suas classes em outra. Mas usá-los com tipos básicos também vale a pena considerar ... e vejo isso mencionado muito raramente.


1
Bom truque! Uma coisa a observar: o static implicit operator boolmétodo deve ser declarado dentro do arquivoCustomClass . Eu criei um DotNetFiddle para ele para fins de demonstração.
Matt

1
@ Matt - Ah, minha resposta já tem 2 anos. Atualizei um pouco o código e adicionei sua dica.
Batalha

4

É um operador implícito de conversão (em oposição a um operador explícito, que requer a (type)sintaxe de conversão)

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.