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 ?

Bart
fonte

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

Rex M
fonte
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;
Cheng Chen
fonte
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.

Batalha
fonte
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)

Andrew Barber
fonte