2016-07-02 2 views
0
public static int[,] operator *(int[,] arr1, int[,] arr2) 
    { 
     int sum; 
     int[,] res = new int[arr1.GetLength(0), arr2.GetLength(1)]; 
     for (int i = 0; i < arr1.GetLength(0); i++) 
     { 
      for (int j = 0; j < arr2.GetLength(1); j++) 
      { 
       sum = 0; 
       for (int k = 0; k < arr1.GetLength(1); k++) 
       { 
        sum = sum + (arr1[i, k] * arr2[k, j]); 
       } 
       res[i, j] = sum; 
       //Console.Write("{0} ", res[i, j]); 
      } 
      //Console.WriteLine(); 
     } 

     return res; 
    } 

Here i * Betreiber zu überlasten versuche zwei Matrizen zu multiplizieren .. aber der Compiler hält mir den Fehler zeigt, dass ..einer der Parameter eines Binäroperators müssen die enthaltenen Typ C# sein

„einer der Parameter eines Binäroperators muss der enthaltende Typ C# sein“

bitte sagen Sie mir, was das Problem in meinem Code ist und wie es zu lösen ..

+0

Der Compiler sagt Ihnen genau das Problem - Sie dürfen keine willkürlichen Operatoren überladen ... Sie können Operatoren nur überlasten, wenn einer der Operanden (oder der Rückgabetyp für eine Konvertierung) der Typ ist, in dem Sie erklären den Operator –

+0

Ich muss zugeben, ich war zunächst verwirrt wie OP war, wie aus C++ (denke freie Funktionen). Aber herausgefunden, dass C# nicht so permissiv wie C++ ist. – mireazma

Antwort

2

der Compiler bereits sagt Ihnen, was ist falsch - aber um Abschnitt 7.3.2 der C# 5 zu zitieren Spezifikation:

Benutzerdefinierte Operatordeklarationen erfordern immer mindestens einen der Parameter des Klassen- oder Strukturtyps, der die Operatordeklaration enthält. Daher ist es für einen benutzerdefinierten Operator nicht möglich, dieselbe Signatur wie ein vordefinierter Operator zu haben.

Mit anderen Worten, es wäre in Ordnung zu haben:

class Foo 
{ 
    public static int[,] operator *(int[,] arr1, Foo arr2) 
    { 
     ... 
    } 
} 

... weil dann der zweite Operand ist die Deklaration Typ. Aber in Ihrem Fall sind beide Operanden int[,].

Was Sie könnte tun ist stattdessen eine Erweiterungsmethode hinzufügen:

public static class ArrayExtensions 
{ 
    public static int[,] Times(this int[,] arr1, int[,] arr2) 
    { 
     ... 
    } 
} 

Dann könnten Sie haben:

int[,] x = ...; 
int[,] y = ...; 
int[,] z = x.Times(y); 

Eine andere Lösung - eine bessere, IMO, wäre Ihr zu erklären eigene Matrix Klasse, um Matrixoperationen einzukapseln. Dann können Sie definieren Sie Ihre eigenen Multiplikationsoperator:

public static Matrix operator *(Matrix left, Matrix right) 

... und Sie stören nicht mit int[,] Arrays, die nicht als Matrizen behandelt werden sollen.

Verwandte Themen