8
votes

Surcharger l'opérateur + pour ajouter deux tableaux

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 :


1
votes

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).

Malheureusement, vous Impossible d'écrire du code dans la classe CLASSE.

Ce que vous pouvez faire est de

  • Créez votre propre classe qui implémente IList
  • et mettez l'opérateur + sur cette classe.

    Si vous avez besoin d'une implémentation plus détaillée, demandez-moi simplement.


1 commentaires

C'est dommage qu'il n'y ait aucun moyen d'une classe peut implémenter ceci [int] de manière à correspondre au comportement de l'indication de la matrice (renvoyer un byref plutôt qu'une valeur).



2
votes

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


0 commentaires

17
votes

Les opérateurs doivent être déclarés à l'intérieur d'un corps "de classe" associé. Par exemple: xxx

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.

d'autre part, vous pouvez définir une méthode d'extension comme: xxx

la volonté mène toujours à Appels naturels ( x.add (y) ) tout en évitant de envelopper des tableaux dans votre propre classe.


0 commentaires

1
votes

Vous ne pouvez ajouter que des opérateurs à un type que vous créez vous-même. A int [] est un type intégré que vous ne pouvez pas ajouter des opérateurs à celui-ci.

Vous pouvez créer votre propre classe qui encapsule une matrice et y ajouter l'opérateur.


0 commentaires

3
votes

2 commentaires

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.