Я определяю физические единицы в C #, используя общие структуры, и все шло нормально, пока я не получил ошибку:
Одним из параметров бинарного оператора должен быть содержащий тип
при попытке перегрузить математические операторы, чтобы они конвертировали между различными единицами. Итак, у меня есть что-то вроде этого:
public interface ScalarUnit { }
public class Duration : ScalarUnit { }
public struct Scalar<T> where T : ScalarUnit
{
public readonly double Value;
public Scalar(double Value)
{
this.Value = Value;
}
public static implicit operator double(Scalar<T> Value)
{
return Value.Value;
}
}
public interface VectorUnit { }
public class Displacement : VectorUnit { }
public class Velocity : VectorUnit { }
public struct Vector<T> where T : VectorUnit
{
#...
public static Vector<Velocity> operator /(Vector<Displacement> v1, Scalar<Duration> v2)
{
return new Vector<Velocity>(v1.Magnitude / v2, v1.Direction);
}
}
Нет ошибок для операторов +
и -
, где я просто работаю над Vector<T>
, но когда я заменяю единицу на T
, внезапно это не нравится , Есть ли способ сделать эту работу?
Я подумал, что это сработает, поскольку Displacement
реализует интерфейс VectorUnit
, и у меня есть where T : VectorUnit
в заголовке структуры. Я хотя бы на правильном пути здесь? Я новичок в C #, поэтому мне трудно понять, что происходит иногда.