泛型结构中的运算符重载:是否可以为特定类型(?)创建重载普通的吗? [英] Operator overloading in generic struct: can I create overloads for specific kinds(?) of generic?

查看:38
本文介绍了泛型结构中的运算符重载:是否可以为特定类型(?)创建重载普通的吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用泛型结构在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#,所以有时很难理解发生了什么。

推荐答案

我认为运算符不能是泛型的。

我可能会考虑硬编码运算符中的类型,也就是说,如果typeof(T).GetGenericParameters()[0]是这样或那样的类型胡说八道。

我甚至更喜欢的另一种方法是在所有返回双精度值的子类中实现一个公共接口/基类,然后从运算符将其向下强制转换为该接口/B.class并获取要计算的值。

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

这篇关于泛型结构中的运算符重载:是否可以为特定类型(?)创建重载普通的吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆