I have two interfaces defined:
// IVector.cs
public interface IVector
{
int Size { get; }
float this[int index] { get; set; }
}
// IMatrix.cs
publi
Found my own answer again (and it's a bit of a hack):
// IVector.cs
public interface IVector
where T : IVector
{
int Size { get; }
float this[int index] { get; set; }
}
// IMatrix.cs
public interface IMatrix
where T : IMatrix
{
int Size { get; }
float this[int row, int column] { get; set; }
}
// VectorExtensions.cs
public T Add(this IVector vector, T value)
where T : struct, IVector
{
var output = default(T);
for (int i = 0; i < output.Size; i++)
output[i] = vector[i] + value[i];
return output;
}
// MatrixExtensions.cs
public static T Add(this IMatrix matrix, T value)
where T : struct, IMatrix
{
var output = default(T);
for (int i = 0; i < output.Size; i++)
for (int j = 0; j < output.Size; j++)
output[i, j] = vector[i, j] + value[i, j];
return output;
}
It works beautifully. Hooray for CRTP :D