C# 隐式转换期间对值进行钳制和舍入

C# 隐式转换期间对值进行钳制和舍入,c#,struct,implicit-conversion,C#,Struct,Implicit Conversion,我有一个自定义的整型。这是它在C#中的定义 PitchClass是一个值在[0,11]范围内的int 正如您可以从C代码中读取的那样,int和double值都可以使用标准模运算符隐式转换为PitchClass: 在隐式转换过程中,double值也会四舍五入: PitchClass pitchClass = -3.4d; Console.WriteLine(pitchClass); // 9 我找不到其他自定义数据类型的示例,它们对要转换的数据类型做了很多事情 为什么??这是坏习惯吗?如果是这样

我有一个自定义的整型。这是它在C#中的定义

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

正如您可以从C代码中读取的那样,
int
double
值都可以使用标准模运算符隐式转换为
PitchClass

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

PitchClass pitchClass = -3.4d;
Console.WriteLine(pitchClass); // 9
我找不到其他自定义数据类型的示例,它们对要转换的数据类型做了很多事情

为什么??这是坏习惯吗?如果是这样,是否有其他方法可以避免对每个方法中的每个PitchClass变量进行参数验证


谢谢

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

请看一看执行情况。这个结构实现了许多接口,使它可以转换为其他结构类型,可以很好地格式化它,以及其他一些东西

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

中的复杂类型作为自定义数据类型的示例,它们与其他类型之间进行许多不同的转换


此外,从double到int的显式转换与您所做的类似,使此转换变窄(可能会导致数据丢失)。

不,根据您的需要,这是一种不错的做法,并且有很多示例,至于做这么多事情的
这实际上非常轻,您可能需要更多的锅炉板,才能使其适用于您可能使用的多种类型的操作符。这里有很多方法,但是,如果这种类型被大量使用,那么可能值得做出努力来正确地使用它,并添加您所需要的内容。从double explicit进行转换怎么样?从double到int的转换也是显式的。
PitchClass pitchClass = -3;
Console.WriteLine(pitchClass); // 9
PitchClass pitchClass = -3.4d;
Console.WriteLine(pitchClass); // 9