静的暗黙演算子


158

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

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

どういうstatic implicit operator意味ですか?

回答:


263

これは変換演算子です。それはあなたがこのコードを書くことができることを意味します:

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

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

これは、開発者がコンパイラに伝える方法です。

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


11
+1。暗黙的な変換の使用例は時々ありますが、奇妙な/驚くべきバグを引き起こし、(人間の)APIユーザーを混乱させる可能性があることも付け加えておきます。例として、BCLで暗黙的な変換を使用することはほとんどありません。慎重に使用してください!
Drew Noakes、2015

13

あなたが変換することができ、このような暗黙のオペレータ手段XmlBaseXElement暗黙のうちに。

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

この明示的な変換はとにかく機能しますか?XElement xelement = (XElement)xmlBase;それが言う質問ではstatic、それは静的である必要がありますか?非静的ではないので、インスタンス化できますか?
2013

6

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

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つを別のクラスに変換することです。しかし、基本型でそれらを使用することも検討に値します。


1
ナイストリック!もう一つ注意すべき:static implicit operator boolメソッドが宣言されなければならないの内側CustomClassDotNetFiddleを作成しました デモ用にを。
Matt

1
@マット-ああ、私の答えはもう2歳です。コードを少し更新し、ヒントを追加しました。
バトル

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.