Perché non posso definire entrambi gli operatori impliciti ed espliciti?

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.