我是否可以从运算符重载进行这种隐式转换

本文关键字:转换 重载 是否 运算符 | 更新日期: 2023-09-27 18:30:17

我正在尝试重载类中的除法运算符以返回双精度数。

我有两个班级:LengthAngle。在Angle类中,我有接受不同三角函数比率的初始值设定项。下面是一个示例:

public class Angle
{
    public double Degrees;
    public double Minutes;
    public double Etc;
    public Angle(double radians)
    {
        // Main initialization here.
    }
    public static Angle FromTangent(double tangent)
    {
        return new Angle(Math.Atan(tangent));
    }
}

Length 类将测量输入转换为不同的度量单位。最后一种方法真的会让生活变得轻松:

public class Length
{
    public double Inches;
    public double Feet;
    public double Meters;
    public double Etc;
    public enum Unit { Inch, Foot, Meter, Etc };
    public Length(double value, Unit unit)
    {
        // Main initialization here.
    }
    public static Length operator /(Length dividend, Length divisor)
    {
        double meterQuotient = dividend.Meters / divisor.Meters;
        return new Length(meterQuotient, Unit.Meter);
    }
    // This is what I want to be able to do.
    public static double operator /(Length dividend, Length divisor)
    {
        double ratio = dividend.Meters / divisor.Meters;
        return ratio;
    }
}

问题是最后两种方法含糊不清。我做了一些研究,隐式转换似乎是正确的学习路径。我尝试了以下方法,这些方法似乎语法不正确:

    public static implicit operator double /(Length dividend, Length divisor) { }
    public static double implicit operator /(Length dividend, Length divisor) { }
    public static implicit double operator /(Length dividend, Length divisor) { }

最终

我希望能够划分两个Length对象,并获得一个双精度。不过,它只对除法有效,因为它返回一个比率,而不是一个单位数。如果这是可能的,实现将非常容易,而且很棒。这就是为什么我想知道这是否可能。

Length opposite = new Length(userInputValue, userSelectedUnitOfMeasure);
Length adjacent = new Length(otherInputValue, otherUnitOfMeasure);
Angle angle = Angle.FromTangent(opposite / adjacent); // ← So cool if this is possible

这是否可以在仍然能够保持我的其他除法操作员过载的情况下完成?

我是否可以从运算符重载进行这种隐式转换

转换不是除法 - 这是两个独立的操作。您目前似乎正试图将它们结合起来。

从根本上说,您似乎应该删除此运算符:

// Kill this
public static Length operator /(Length dividend, Length divisor)

这根本没有意义——正如你提到的,长度除以长度是一个比率,它不是长度。 5m/2m 是 2.5,而不是 2.5m。

一旦删除它,就没有歧义,所以你没事。

另一方面,拥有英寸、英尺、米等字段对我来说似乎是一个坏主意。您可能希望有两个字段,其中一个是量级,另一个是单位(可能是枚举)。