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


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)синтаксису перетворення)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.