Я создаю библиотеку линейной алгебры в C#, и я хотел бы заставить ошибки несогласованности размерности до времени компиляции. Я реализовал аналогичное решение для this, где признаком, который я использую, является класс, который однозначно отображает целое число. Проблема заключается в том, что для каждого возможного размера, который я бы хотел, чтобы мои векторы имели, мне нужно было бы создать класс с уникальным именем для его представления.Проверка согласованности векторного математического измерения во время компиляции
Вот пример того, что реализации:
public class Vector<T> where T: ISize, new()
{
static readonly T size = new T();
List<double> values;
public Vector(List<double> values)
{
if (values.Count != size.Size)
throw new IndexOutOfRangeException();
this.values = new List<double>(values);
}
public double Get(int index)
{
return values[index];
}
public Vector<T> Add(Vector<T> other)
{
var vv = new List<double>();
for (int ii = 0; ii < size.Size; ++ii)
vv.Add(other.Get(ii) + this.values[ii]);
return new Vector<T>(vv);
}
}
public interface ISize
{
int Size { get; }
}
public class S1 : ISize
{
public int Size
{
get { return 1; }
}
}
public class S2 : ISize
{
public int Size
{
get { return 2; }
}
}
А вот пример его использования:
class Program
{
static void Main(string[] args)
{
var v1 = new Vector<S2>(new List<double>() { 1, 2 });
var v2 = new Vector<S2>(new List<double>() { 10, -4 });
var z1 = new Vector<S1>(new List<double>() { 10 });
// works
var v3 = v1.Add(v2);
// complie-time error
var z2 = z1.Add(v1);
}
}
Это работает очень хорошо для моих целей, за исключением того, что мне нужно, кроме для создания различной реализации ISize для любого возможного размера Vector. Есть ли способ реализовать класс Vector, который позволил бы мне обойти эту проблему?
Без эквивалента C++ «параметры шаблона непигового типа», я не думаю, что это возможно. –