c# – 泛型结构中的运算符重载:我可以为泛型的特定种类(?)创建重载吗?

我在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).

点赞