2

それは私だけの問題ではないように思えます。
これらの質問を調べても解決策が見つからなかったので、私の質問を重複として閉じないでください。

class Matrix<T> {
        private Int32 rows;
        private Int32 cols;
        private T[,] matrix;

        public Matrix() {
            rows = cols = 0;
            matrix = null;
        }

        public Matrix(Int32 m, Int32 n) {
            rows = m;
            cols = n;
            matrix = new T[m, n];
        }

        public T this[Int32 i, Int32 j] {
            get {
                if (i < rows && j < cols)
                    return matrix[i, j];
                else
                    throw new ArgumentOutOfRangeException();
            }
            protected set {
                if (i < rows && j < cols)
                    matrix[i, j] = value;
                else
                    throw new ArgumentOutOfRangeException();
            }
        }

        public Int32 Rows {
            get { return rows; }
        }

        public Int32 Cols {
            get { return cols; }
        }

        public static Matrix<T> operator+(Matrix<T> a, Matrix<T> b) { 
            if(a.cols == b.cols && a.rows == b.rows) {
                Matrix<T> result = new Matrix<T>(a.rows, a.cols);
                for (Int32 i = 0; i < result.rows; ++i)
                    for (Int32 j = 0; j < result.cols; ++j)
                        result[i, j] = a[i, j] + b[i, j];
                return result;
            }
            else
                throw new ArgumentException("Matrixes don`t match operator+ requirements!");
        }

        public static Matrix<T> operator-(Matrix<T> a, Matrix<T> b) {
            if (a.cols == b.cols && a.rows == b.rows) {
                Matrix<T> result = new Matrix<T>(a.rows, a.cols);
                for (Int32 i = 0; i < result.rows; ++i)
                    for (Int32 j = 0; j < result.cols; ++j)
                        result[i, j] = a[i, j] - b[i, j];
                return result;
            }
            else
                throw new ArgumentException("Matrixes don`t match operator- requirements!");
        }

コンパイラが言うことを知っています:「演算子 '-' は、タイプ 'T' および 'T' のオペランドには適用できません」、つまりすべての演算子です。
それで、これに対する最良の決定は何ですか?私の知る限り、インターフェイスには演算子を含めることができないため、唯一の方法は T 型の抽象基本クラスですが、私が発見したように、operatoes を抽象として定義することはできません。

4

3 に答える 3

2

たとえば、ネットジェネリックのオーバーロードされた演算子制約の解決策が役に立たないのはなぜですか?

于 2009-04-24T11:38:05.063 に答える
0

演算子をオーバーロードできますが、コンパイラは 2 つの未知のジェネリック型 (T + T) を追加する方法を認識できず、演算子は静的メンバーであるため、制約を追加できません。

それを行う方法 ( .Net 2.0 の[編集] ) は、Matrix の静的コンストラクターにすべての演算子メソッドのファクトリを用意することです。これにより、値型 T の正しい実装が作成されます (その TypeCode に基づいて、例)、またはNotImplementedExceptionサポートされていない値の型に対してa をスローします。しかし、この方法では、コンパイル時のチェックはありません。

[編集] .Net 3.5 では、式ツリーを使用して一般的なパラメーターの演算子を実際に取得できます: https://jonskeet.uk/csharp/miscutil/usage/genericoperators.html

このリンクも確認できます: http://msdn.microsoft.com/en-us/library/system.linq.expressions.binaryexpression.aspx

于 2009-04-24T11:51:34.517 に答える