Статический неявный оператор - PullRequest
128 голосов
/ 25 ноября 2010

Я недавно нашел этот код:

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

Что означает static implicit operator?

Ответы [ 4 ]

221 голосов
/ 25 ноября 2010

Это оператор преобразования . Это означает, что вы можете написать этот код:

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

И компилятор не будет жаловаться! Во время выполнения будет выполнен оператор преобразования: передается myBase в качестве аргумента и возвращается действительный XElement в качестве результата.

Вы, как разработчик, можете сказать компилятору:

«Несмотря на то, что они выглядят как два совершенно не связанных типа, на самом деле существует способ преобразования из одного в другой; просто позвольте мне разобраться с логикой того, как это сделать».

11 голосов
/ 25 ноября 2010

Такой неявный оператор означает, что вы можете неявно преобразовать XmlBase в XElement.

XmlBase xmlBase = WhatEverGetTheXmlBase();
XElement xelement = xmlBase;   
//no explicit convert here like: XElement xelement = (XElement)xmlBase;
4 голосов
/ 25 ноября 2010

Это неявный оператор преобразования (в отличие от явного оператора, который требует синтаксиса (type) преобразования)

3 голосов
/ 10 июля 2018

Другое интересное использование (которое Unity сделал, чтобы проверить, является ли объект (и, следовательно, экземпляр MonoBehavior) нулевым):

public static implicit operator bool (CustomClass c)
{
    if (c == null) return false;
    else return true;
}

Таким образом, вы можете сделать что-то вроде этого:

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

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

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

Очевидно, что самым печально известным использованием может быть его использование для преобразования одного из ваших классов в другой из ваших классов. Но использование их с базовыми типами также заслуживает рассмотрения ... и я вижу, что оно упоминается довольно редко.

...