Использование ограниченных дженериков вместо интерфейсов - недостатки?

Допустим, у меня есть

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 .

Он работает нормально и все такое, но есть ли какие-то недостатки, о которых я не знаю (кроме незначительного увеличения использования памяти)? Это общепринятая практика или она не рекомендуется по какой-либо причине, о которой я мог не знать?

8
задан Mehrdad 3 December 2011 в 20:33
поделиться