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.