Допустим, у меня есть
interface IMatrix {
double this[int r, int c] { get; }
}
struct Matrix2x2 : IMatrix {
double a1, a2, b1, b2;
double this[int r, int c] { get { ... } }
}
struct Matrix3x3 : IMatrix {
double a1, a2, a3, b1, b2, b3, c1, c2, c3;
double this[int r, int c] { get { ... } }
}
class Matrix : IMatrix { // Any size
double[,] cells;
double this[int r, int c] { get { ... } }
}
Иногда вместо того, чтобы просто сказать
static class Matrices {
static IMatrix Multiply(IMatrix a, IMatrix b) { ... }
}
, я выполняю
static class Matrices {
static IMatrix Multiply<T1, T2>(T1 a, T2 b)
where T1 : IMatrix
where T2 : IMatrix { ... }
}
или, может быть, даже
static class Matrices {
static IMatrix Multiply<T1, T2>([In] ref T1 a, [In] ref T2 b)
where T1 : IMatrix
where T2 : IMatrix { ... }
}
, чтобы избежать упаковки или копирования struct
s .
Он работает нормально и все такое, но есть ли какие-то недостатки, о которых я не знаю (кроме незначительного увеличения использования памяти)? Это общепринятая практика или она не рекомендуется по какой-либо причине, о которой я мог не знать?