Operator implisit statis

158

Baru-baru ini saya menemukan kode ini:

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

Apa static implicit operatorartinya

Bart
sumber

Jawaban:

263

Ini adalah operator konversi . Ini berarti Anda dapat menulis kode ini:

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

Dan kompiler tidak akan mengeluh! Saat runtime, operator konversi akan dieksekusi - lewat myBasesebagai argumen, dan mengembalikan yang valid XElementsebagai hasilnya.

Ini cara Anda sebagai pengembang untuk memberi tahu kompiler:

"Meskipun ini terlihat seperti dua jenis yang sama sekali tidak berhubungan, sebenarnya ada cara untuk mengkonversi dari satu ke yang lain; biarkan aku menangani logika bagaimana melakukannya."

Rex M
sumber
11
+1. Saya akan menambahkan bahwa sementara ada penggunaan konversi implisit yang sesekali baik, itu juga dapat menyebabkan bug aneh / mengejutkan, dan dapat membingungkan pengguna API (manusia). Sebagai contoh, ada beberapa penggunaan konversi implisit di BCL. Gunakan dengan kebijaksanaan!
Drew Noakes
13

Seperti sarana Operator implisit Anda dapat mengkonversi XmlBaseke XElementimplisit.

XmlBase xmlBase = WhatEverGetTheXmlBase();
XElement xelement = xmlBase;   
//no explicit convert here like: XElement xelement = (XElement)xmlBase;
Cheng Chen
sumber
dapatkah konversi eksplisit ini berfungsi? XElement xelement = (XElement)xmlBase;Dalam pertanyaannya static, apa yang harus statis? Tidak bisakah itu non-statis, jadi itu bisa dipakai?
bercita
6

Penggunaan lain yang menarik adalah (yang dilakukan Unity untuk memeriksa apakah suatu objek (dan karenanya turunan dari MonoBehavior) adalah nol):

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

Perhatikan bahwa kode harus berada di dalam kelas (CustomClass dalam kasus ini). Dengan begitu Anda dapat melakukan sesuatu seperti ini:

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

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

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

Jelas penggunaan yang paling terkenal mungkin menggunakannya untuk mengkonversi salah satu kelas Anda ke kelas Anda yang lain. Tetapi menggunakannya dengan tipe dasar juga patut dipertimbangkan ... dan saya melihatnya jarang disebutkan.

Pertarungan
sumber
1
Trik yang bagus! Satu hal yang perlu diperhatikan: static implicit operator boolmetode harus dideklarasikan di dalam CustomClass. Saya telah membuat DotNetFiddle untuk tujuan demo.
Matt
1
@ Mat - Ah, jawabanku sudah 2 tahun sekarang. Saya sedikit memperbarui kode dan menambahkan petunjuk Anda.
Pertempuran
4

Ini adalah operator konversi implisit (sebagai lawan dari operator Eksplisit, yang memerlukan (type)sintaksis konversi)

Andrew Barber
sumber