それは私の問題だけではないようです。
私はこれらの質問を見て、私は解決策を見つけることができなかったので、私の質問を複製として閉じないでください。
汎用クラスの演算子をどのようにオーバーロードしますか?
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の抽象基本クラスだけですが、オペラートを抽象として定義することはできません。
@ShuggyCoUk - 実際には、「ダイナミック」(C#4.0)でサポートしています。だから、これはうまくいくだろうが、遅くなるだろう。 –
申し訳ありません - 私はもっと明確にすべきでした。動的でもジェネリック型ではできませんが、動的に_キャスト*して、それをサポートするものすべてに対して操作を実行できます。エンド・ユーザーが正しい演算子を使用したい場合(コンパイル・チェックをすべて削除する)、これは問題ありません。プリミティブや構造体(おそらくケース)のパフォーマンスに遠く離れたものを手に入れたいのであれば、彼らはそうしないでしょう。 – ShuggyCoUk