Статический неявный оператор

158

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

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

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

Барт
источник

Ответы:

263

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

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

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

Это способ для вас, как для разработчика, сказать компилятору:

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

Рекс М
источник
11
+1. Я хотел бы добавить, что, хотя иногда неявное преобразование бывает хорошим, оно также может вызывать странные / неожиданные ошибки и может вводить в заблуждение пользователя (человека) API. Например, в BCL очень мало неявных преобразований. Используйте с осторожностью!
Дрю Ноукс
13

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

XmlBase xmlBase = WhatEverGetTheXmlBase();
XElement xelement = xmlBase;   
//no explicit convert here like: XElement xelement = (XElement)xmlBase;
Ченг Чен
источник
может ли это явное преобразование работать в любом случае? XElement xelement = (XElement)xmlBase;В вопросе говорится static, что это должно быть статичным? Разве это не может быть нестатичным, поэтому его можно создать?
Стремясь
6

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

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

Обратите внимание, что код должен быть внутри класса (в данном случае CustomClass). Таким образом, вы можете сделать что-то вроде этого:

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

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

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

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

Боевой
источник
1
Хороший трюк! Одна вещь , обратите внимание: static implicit operator boolметод должен быть объявлен внутриCustomClass . Я создал DotNetFiddle для этого в демонстрационных целях.
Мэтт
1
@Matt - Ах, мой ответ уже 2 года. Я немного обновил код и добавил вашу подсказку.
битва
4

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

Эндрю Барбер
источник