Statik örtük operatör


158

Geçenlerde bu kodu buldum:

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

Ne anlama static implicit operatorgeliyor?

Yanıtlar:


263

Bu bir dönüşüm operatörü . Bu, bu kodu yazabileceğiniz anlamına gelir:

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

Ve derleyici şikayet etmeyecek! Çalışma zamanında, dönüştürme işleci yürütülür - myBasebağımsız değişken olarak iletilir ve XElementsonuç olarak geçerli bir değer döndürülür .

Bir geliştirici olarak derleyiciye söylemenin bir yolu:

"bunlar tamamen birbiriyle alakasız iki tip gibi görünse de, aslında birinden diğerine dönüştürmenin bir yolu var; sadece nasıl yapılacağına dair mantığı idare edeyim."


11
+1. Örtük dönüşümün arada sırada iyi kullanımları olsa da, garip / şaşırtıcı hatalara neden olabileceğini ve (insan) bir API kullanıcısını karıştırabileceğini de ekleyeceğim. Örneğin, BCL'de örtük dönüşümlerin çok az kullanımı vardır. Takdirle kullanın!
Drew Noakes

13

Böyle bir örtük operatör XmlBase, XElementdolaylı olarak dönüştürebileceğiniz anlamına gelir .

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

bu açık dönüşüm yine de işe yarayabilir mi? XElement xelement = (XElement)xmlBase;Yazdığı soruda static, statik olması gereken ne? Statik olamaz mı, bu yüzden somutlaştırılabilir mi?
isteyen

6

Bir başka ilginç kullanım (Unity'nin bir nesnenin (ve bu nedenle MonoBehavior örneğinin) boş olup olmadığını kontrol etmek için yaptığı):

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

Kodun sınıf içinde olması gerektiğini unutmayın (bu durumda CustomClass). Bu şekilde böyle bir şey yapabilirsiniz:

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

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

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

Açıkçası en kötü şöhretli kullanım, sınıflarınızdan birini sınıflarınızdan birine dönüştürmek için kullanıyor olabilir. Ancak bunları temel tiplerle kullanmak da dikkate değerdir ...


1
İyi numara! Unutulmaması gereken bir şey: static implicit operator boolyöntem beyan edilmesi gerekir içerideCustomClass . Demo amaçlı bir DotNetFiddle oluşturdum .
Matt

1
@Matt - Ah, cevabım 2 yaşında. Kodu biraz güncelledim ve ipucunu ekledim.
Savaşı

4

Örtük bir dönüşüm operatörü ( (type)dönüşüm sözdizimini gerektiren bir Açık operatörün aksine )

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.