2009-04-17 14 views
23

¿Por qué no puedo definir operadores implícitos y explícitos como ese?¿Por qué no puedo definir operadores implícitos y explícitos?

public class C 
    { 
     public static implicit operator string(C c) 
     { 
      return "implicit"; 
     } 

     public static explicit operator string(C c) 
     { 
      return "explicit"; 
     } 
    } 

Usted puede hacer este truco sin embargo :)

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; 
     } 
    } 

Esta impresora:

implicit 
explicit 
+0

¿Quién dice que no puede? Es decir, ¿qué pasa cuando lo intentas? –

+0

¿Por qué querrías implementaciones diferentes entre los dos? –

+1

Anulación de ToString ni siquiera está CERCA de un operador de conversión implícito. Su código de ejemplo solo funciona porque Console.WriteLine tiene una sobrecarga de objeto y llama a ToString() en el objeto. – Samuel

Respuesta

5

no sé la limitación técnica que evita esto, pero creo que tendrían hecho esto para evitar que las personas disparen sus propios pies.

string imp = new C(); // = "implicit" 
string exp = (string)new C(); // = "explicit" 

que reduciría a mí loco y no tiene ningún sentido, C sólo debe emitir a una forma de cadena 1, no 2 maneras diferentes.

+0

Puedes hacerlo de dos formas, simplemente no puedes hacer una conversión personalizada para ambos. – Prankster

+1

No, no puedes hacerlo, ToString no es un operador de elenco. – Samuel

+0

"Ejemplo" actualizado – Prankster

35

Comprobar esto: Why can't coexist implicit and explicit operator of the same type in C#?

Si se define un operador explícita, usted será capaz de hacer algo como esto:

Thing thing = (Thing)"value"; 

Si se define un operador implícita, todavía se puede hacer lo anterior, pero también se puede tomar ventaja de la conversión implícita:

Thing thing = "value"; 

En resumen, explícita sólo permite la conversión explícita, implícita, mientras que permite a la vez explícita y implici t ... de ahí la razón por la que solo puedes definir uno.

Cuestiones relacionadas