我在C#中定义了物理单位,使用了通用结构,直到我收到错误它才正常:
One of the parameters of a binary operator must be the containing type
当试图重载数学运算符,使它们在不同单位之间转换.所以,我有这样的事情:
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头中有T:VectorUnit.我在这里至少走在正确的轨道上吗?我是C#的新手,所以我很难理解有时会发生什么.
最佳答案 我不认为操作符可以是通用的.
我可能会考虑对运算符中的类型进行硬编码,即如果typeof(T).GetGenericParameters()[0]是这个或那个类型等等.
我甚至更喜欢的另一种方法是在所有返回double的子类中实现一个公共接口/基类,然后从运算符中将它转换为该接口/ b. class并获取要计算的值.
注意:到convention,接口名称应始终以I开头(例如:IScalarUnit).