在隐式转换期间夹紧和舍入一个值

时间:2019-02-03 08:04:00

标签: c# struct implicit-conversion

我已经开发了一个自定义整数类型。这是它在C#中的定义。

public struct PitchClass
{
    private readonly int value;

    private PitchClass(int value)
    {
        this.value = CanonicalModulus.Calculate(value, 12);
    }

    public static implicit operator PitchClass(int value)
    {
        return new PitchClass(value);
    }

    public static implicit operator PitchClass(double value)
    {
        return new PitchClass((int)Math.Round(value));
    }

    public static implicit operator int(PitchClass pitchClass)
    {
        return pitchClass.value;
    }
}

PitchClass是一个int,其值在[0,11]范围内。

您可以从C#代码中读取,intdouble的值都可以使用规范模运算符隐式转换为PitchClass

>
PitchClass pitchClass = -3;
Console.WriteLine(pitchClass); // 9

在隐式转换过程中,double的值也会四舍五入:

PitchClass pitchClass = -3.4d;
Console.WriteLine(pitchClass); // 9

我找不到其他自定义数据类型的示例,这些示例对要转换的数据类型做了很多事情。

为什么?这是不好的做法吗?如果是这样,还有另一种方法可以避免对每种方法中的每个PitchClass变量进行参数验证吗?

谢谢

1 个答案:

答案 0 :(得分:2)

创建基本类型并将其转换为其他基本数据类型是不错的做法。也不能定义隐式和显式转换。

看一下Int32 in the .Net Framework的实现。该结构实现了许多接口,以使其可转换为其他结构类型,从而很好地对其进行格式化以及其他一些东西。

如果您打算大量使用此结构,则实现IConvertible,IComparable,IEquatable(以及GetHashCode()和Equals()方法)是一个好主意,因为几乎所有本机数据类型都这样做。

复杂类型在the explanation for IConvertible interface中作为“自定义”数据类型的示例给出,它们在与其他类型之间进行了许多不同的转换。

此外,从double到int的显式转换也和您所做的一样,使转换变窄(可能导致数据丢失)。