Perché non posso definire entrambi gli operatori impliciti ed espliciti in questo modo?
public class C { public static implicit operator string(C c) { return "implicit"; } public static explicit operator string(C c) { return "explicit"; } }
Puoi fare questo hack però 🙂
class Program { public class A { } public class B { public static implicit operator A(B b) { Console.WriteLine("implicit"); return new A(); } } public class C : B { public static explicit operator A(C c) { Console.WriteLine("explicit"); return new A(); } } static void Main(string[] args) { C c = new C(); A a = c; A b = (A) c; } }
Questo stampa:
implicit explicit
Verifica questo: perché non può coesistere un operatore implicito ed esplicito dello stesso tipo in C #?
Se definisci un operatore esplicito, sarai in grado di fare qualcosa del genere:
Thing thing = (Thing)"value";
Se definisci un operatore implicito, puoi comunque eseguire quanto sopra, ma puoi anche avvantaggiarti della conversione implicita:
Thing thing = "value";
In breve, l’esplicito consente solo la conversione esplicita, mentre implicito consente sia esplicito che implicito … quindi il motivo per cui è ansible definirne solo uno.
Non conosco la limitazione tecnica che impedisce questo, ma penso che lo avrebbero fatto per impedire alle persone di sparare i piedi.
string imp = new C(); // = "implicit" string exp = (string)new C(); // = "explicit"
Ciò mi farebbe impazzire e non avrebbe senso, C
dovrebbe lanciare una stringa solo in un modo, non in 2 modi diversi.