夹紧和隐式转换期间的舍入的值

问题描述 投票:2回答:1

我已经开发的自定义整型。这是它在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;
    }
}

所述PitchClassint其值的范围在[0,11]。

正如可以从C#代码读取这两种intdouble值可以隐式转换使用一个规范模量运算符来PitchClass

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

所述double值的隐式转换期间也四舍五入:

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

我无法找到这样做的许多事情中的数据类型转换自定义数据类型的其他例子。

为什么?它是不好的做法?如果是这样,有另一种方式,以避免做参数验证了在每一个方法的每PitchClass变量?

谢谢

c# struct implicit-conversion
1个回答
2
投票

这不是不好的做法,建立一个基本类型,使之转换为其他基本数据类型。也不是界定隐性和显性的转换。

看看Int32 in the .Net Framework的实施。这种结构实现了许多接口,使其可转换为其他结构类型,它很好地格式化和一些其他的东西。

如果你打算在大量使用这种结构,实现IConvertible,IComparable的,IEquatable(和方法GetHashCode()方法和equals()方法)是一个好主意,因为几乎所有的原始数据类型这样做。

复杂类型给出例子the explanation for IConvertible interface自定义数据类型的,他们做许多不同的转换和从其他类型。

此外,从双到INT显式转换是做那种你做同样的事情,使这种转换缩小(可能导致数据丢失)。

© www.soinside.com 2019 - 2024. All rights reserved.