我使用通用结构在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
接口,并且我在struct头中有where T : VectorUnit
。我在这里至少走在正确的轨道上吗?我是C#的新手,所以我很难理解有时会发生什么。
答案 0 :(得分:2)
我不认为运营商可以是通用的。
我可能会考虑对运算符中的类型进行硬编码,即如果typeof(T).GetGenericParameters()[0]是这个或那个类型等等等等。
我甚至更喜欢的另一种方法是在所有返回double的子类中实现一个公共接口/基类,然后从运算符中将它转换为该接口/ b。 class并获取要计算的值。
注意:按convention,接口名称应始终以I
开头(例如:IScalarUnit
)。