web-dev-qa-db-ja.com

静的な暗黙の演算子

私は最近このコードを見つけました:

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

static implicit operator意味?

131
Bart

これは、 変換演算子 です。これは、次のコードを記述できることを意味します。

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

そして、コンパイラは文句を言いません!実行時に、変換演算子が実行されます。引数としてmyBaseを渡し、結果として有効なXElementを返します。

開発者がコンパイラーに伝える方法です。

「これらはまったく関係のない2つのタイプのように見えますが、実際には一方から他方に変換する方法があります。その方法のロジックを処理させてください。」

228
Rex M

このような暗黙の演算子は、XmlBaseXElementに暗黙的に変換できることを意味します。

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

別の興味深い使用法は(Unityがオブジェクト(およびMonoBehaviorのインスタンス)がnullであるかどうかを確認するために行いました):

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
    }
}

明らかに、最も悪名高い使用法は、それを使用して、あるクラスを別のクラスに変換することです。しかし、それらを基本型で使用することも考慮に値します...そして、私はそれがめったに言及されないのを見ます。

4
Battle

暗黙的な変換演算子です((type)変換構文を必要とする明示的な演算子とは対照的です)

4
Andrew Barber