Quel est le problème avec ce code C #? J'ai essayé de surcharger l'opérateur + pour ajouter deux tableaux, mais j'ai reçu un message d'erreur comme suit:
L'un des paramètres d'un opérateur binaire doit être le type contenant. P>
class Program { public static void Main(string[] args) { const int n = 5; int[] a = new int[n] { 1, 2, 3, 4, 5 }; int[] b = new int[n] { 5, 4, 3, 2, 1 }; int[] c = new int[n]; // c = Add(a, b); c = a + b; for (int i = 0; i < c.Length; i++) { Console.Write("{0} ", c[i]); } Console.WriteLine(); } public static int[] operator+(int[] x, int[] y) // public static int[] Add(int[] x, int[] y) { int[] z = new int[x.Length]; for (int i = 0; i < x.Length; i++) { z[i] = x[i] + y[i]; } return (z); } }
5 Réponses :
Lorsque vous souhaitez surcharger l'opérateur Le + entre Type AA et BB, vous devez le faire dans la classe AA ou BB et non dans un programme nommé de classe (comme vous l'avez fait). P>
Malheureusement, vous Ce que vous pouvez faire est de p>
Si vous avez besoin d'une implémentation plus détaillée, demandez-moi simplement. P>
C'est dommage qu'il n'y ait aucun moyen d'une classe peut implémenter ceci [int] code> de manière à correspondre au comportement de l'indication de la matrice (renvoyer un
byref code> plutôt qu'une valeur).
Son stipule que l'un des paramètres à l'opérateur doit être du même type que la fonction opérateur est membre de. Donc, si la fonction opérateur est un membre de MyClass sur les paramètres doit être de type myClass.
class MyClass { ... public static int[] operator+(MyClass x, int[] y) // public static int[] Add(int[] x, int[] y) { int[] z = new int[x.Length]; for (int i = 0; i < x.Length; i++) { z[i] = x[i] + y[i]; } return (z); } }
Les opérateurs doivent être déclarés à l'intérieur d'un corps "de classe" associé. Par exemple: puisque vous n'avez pas accès à la mise en oeuvre des tableaux, votre meilleur choix serait de envelopper vos tableaux dans votre propre implémentation afin que vous puissiez fournir des opérations supplémentaires (etc. est le seul moyen de rendre l'opérateur + travail. p> d'autre part, vous pouvez définir une méthode d'extension comme: p> la volonté mène toujours à Appels naturels ( x.add (y) code>) tout en évitant de envelopper des tableaux dans votre propre classe. p> p>
Vous ne pouvez ajouter que des opérateurs à un type que vous créez vous-même. A Vous pouvez créer votre propre classe qui encapsule une matrice et y ajouter l'opérateur. P> int [] code> est un type intégré que vous ne pouvez pas ajouter des opérateurs à celui-ci. P>
Vous pouvez utiliser quelque chose comme ceci: basé sur un POST que j'ai écrit. p> p>
J'ai initialement évoqué cela, car ma première lecture était celle-ci, elle pourrait permettre au compilateur de penser que vous avez eu des méthodes définies sur la matrice. Cependant, lors de la réflexion, je vois que cela vous permet simplement de cacher le fait que ce que vous avez fait était d'envelopper la matrice avec une couche d'indirection. Emballage La matrice est une solution facile et évidente pour obtenir l'opérateur +, mais elle introduit les autres frais généraux que je ne veux pas.
Oui, envelopper le tableau est un moyen simple d'obtenir ce que vous voulez, mais ce n'est pas l'histoire complète. Ce sont les opérateurs de conversion implicites qui vous permettent de passer de wrapper au tableau et inversement versa plus facilement. En fin de compte, il s'agit simplement d'une idée de la façon de fausse de faux opérateurs d'extension, mais n'est certainement pas parfaite.
La page du didacticiel MSDN sur la surcharge a plus d'informations - MSDN. microsoft.com/en-us/library/aa288467%28vs.71%29.aspx
Ceci peut être votre réponse:
Nous envisageons d'ajouter des "opérateurs d'extension" à une version future hypothétique de C #, qui résoudrait votre problème. Sondage de paille: Vous avez-vous un scénarios génial pour cette fonctionnalité? Les scénarios réalistes les plus géniaux que nous puissions obtenir, plus une fonctionnalité est susceptible d'être mise en œuvre un jour. Envoyez-moi mon chemin; Vous pouvez utiliser le mail de mail sur mon blog.
Merci Eric. Cela signifie-t-il que nous obtiendrons aussi "l'extension tout" :)
Comment faites-nous cela ou devrais-je abandonner le polymorphisme jusqu'à ce que je sois polythéiste?