2

必要なのは、C# で Operator + をオーバーロードして、2 つの行列を合計できるようにすることです。

私が持っているのはこの機能です:

public int[,] operator+(int[,] matriz1, int[,] matriz2)
    {
        int[,] retorno = new int[4, 4];
        for (int i = 0; i < 4; i++)
        {
            for (int j = 0; j < 4; j++)
            {
                retorno[i, j] = matriz1[i, j] + matriz2[i, j];
            }
        }
        return retorno;
    }

たとえば、これを行うと (WT、W1、W2 はすべて int[4,4]):

WT = W1 + W2;

次のエラーが表示されます: 演算子 + は int[ , ] および int[ , ]型のオペランドには適用できません。

4

3 に答える 3

6

まず、演算子を使用する前に、演算子メソッドだけをコンパイルしてみてください。コンパイルされず、エラーメッセージは次のことを示しています:

エラー CS0563: 二項演算子のパラメーターの 1 つは、それを含む型でなければなりません

これはまさにその言葉の意味です: class を書くと(or )Cの加算演算子を書くことができます。なんらかの方法で関与しない演算子を定義することはできません。したがって、単純に、クラスを作成するのはあなたではないため、クラスの演算子を定義することはできません。C + <any type><any type> + CCint[,]

あなたの最善の策は、おそらくMatrix自分でクラスを定義することです。その後、必要な演算子を定義できます。例えば;

public class Matrix
{
    private readonly int[,] _values;

    public int this[int x, int y] {
        get { return _values[x, y]; }
    }

    public Matrix(int[,] values) {
        _values = values;
    }

    public static Matrix operator +(Matrix x, Matrix y) {
        int[,] m0 = x._values;
        int[,] m1 = y._values;
        int[,] newMatrix = /* add m0 and m1 */;
        return new Matrix(newMatrix);
    }
}
于 2013-04-12T01:17:45.800 に答える
3

演算子のオーバーロードは、それが動作するクラスに対して実行する必要があり、この場合、このメソッドが含まれるクラスに対してのみオーバーロードするため、この場合は機能しません。int[,]基本的に、W1 + W2 を実行すると、その組み込み型には存在しないに対して定義された「+」演算子が検索されます。

実行しようとしているように行列で機能するには、Matrixクラスを作成し (おそらく、その値を 2 次元整数配列として内部的に格納する必要があります)、そのクラスの演算子をオーバーロードします。

于 2013-04-12T01:15:32.457 に答える
3

非カスタム型の演算子を書くことはできません:

演算子のオーバーロードにより、一方または両方のオペランドがユーザー定義のクラスまたは構造体型である操作に対して、ユーザー定義の演算子の実装を指定できます。

出典: MSDN

別の方法として、拡張メソッドを作成することもできます。

public static class MatrixExtensions {
    public static  int[,] Add(this int[,] matriz1, int[,] matriz2)
    {
        int[,] retorno = new int[4, 4];
        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 4; j++) {
                retorno[i, j] = matriz1[i, j] + matriz2[i, j];
            }
        }
        return retorno;
    }
}

そして、次のように使用します。

int[,] a = ...
int[,] b = ...
int[,] c = a.Add(b);
于 2013-04-12T01:14:27.000 に答える