2009-04-17 6 views
23

Pourquoi je ne peux pas définir à la fois les opérateurs implicites et explicites?Pourquoi ne puis-je pas définir des opérateurs implicites et explicites?

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

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

Vous pouvez le faire bidouillage :)

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

Cette impression:

implicit 
explicit 
+0

Qui a dit que vous ne pouviez pas? Soit, que se passe-t-il lorsque vous essayez? –

+0

Pourquoi voudriez-vous différentes implémentations entre les deux? –

+1

Overriding ToString n'est même pas proche d'un opérateur de distribution implicite. Votre exemple de code ne fonctionne que parce que Console.WriteLine a une surcharge d'objet et appelle ToString() sur l'objet. – Samuel

Répondre

5

Je ne sais pas la limitation technique qui empêche cela, mais je pense qu'ils auraient fait cela pour empêcher les gens de se tirer d'affaire.

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

qui me conduire de façon folle et n'a pas de sens, C ne doit jeter à une chaîne 1 façon, pas deux façons différentes.

+0

Vous pouvez le faire dans les deux sens, vous ne pouvez pas faire une conversion personnalisée pour les deux. – Prankster

+1

Non, vous ne pouvez pas le faire, ToString n'est pas un opérateur de distribution. – Samuel

+0

"Exemple" mis à jour – Prankster

35

Vérifiez ceci: Why can't coexist implicit and explicit operator of the same type in C#?

Si vous définissez un opérateur explicite, vous serez en mesure de faire quelque chose comme ceci:

Thing thing = (Thing)"value"; 

Si vous définissez un opérateur implicite, vous pouvez toujours faire ce qui précède, mais vous pouvez également profiter de la conversion implicite:

Thing thing = "value"; 

En bref, explicite permet seulement la conversion explicite, implicite alors que permet à la fois explicite et implici t ... d'où la raison pour laquelle vous ne pouvez en définir qu'une.

Questions connexes