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

时间:2011-01-10 03:32:26

标签: c# generics operator-overloading

我使用通用结构在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#的新手,所以我很难理解有时会发生什么。

1 个答案:

答案 0 :(得分:2)

我不认为运营商可以是通用的。

我可能会考虑对运算符中的类型进行硬编码,即如果typeof(T).GetGenericParameters()[0]是这个或那个类型等等等等。

我甚至更喜欢的另一种方法是在所有返回double的子类中实现一个公共接口/基类,然后从运算符中将它转换为该接口/ b。 class并获取要计算的值。

注意:按convention,接口名称应始终以I开头(例如:IScalarUnit)。