[英]Creating a custom type that evaluates to double
我目前正在研究RoundedDouble
类。 此类的目的是为.Net double结构提供替代方法。 它的工作方式与double相似,但四舍五入到小数点后一位。 起初,我们只是想在用户界面级别设置数字格式,但是我们坚持要求确保用户界面中显示的值是计算中使用的值(双精度精度为公认)。 这意味着一个四舍五入到小数点后两位并输入为1.23456789的值应计算为1.23。
(使用自定义TypeConverter
是我们的替代选择,但我们选择了RoundedDouble
,因为这将使我们能够保持算术精度最低,类似于计算数字并考虑其重要性/准确性。)
现在,我为RoundedDouble
类实现了IEquatable<Double>
,并且遇到了以下情况:
object roundedDoubleBoxedAsObject = new RoundedDouble(2, 1.23456789); //1st param is the number of decimal places
double expectedValue = 1.23;
Debug.Assert(Equals(roundedDoubleBoxedAsObject, expectedValue)); // Passes, as RoundedDouble.Equals(double) is called
Debug.Assert(Equals(expectedValue, roundedDoubleBoxedAsObject),
"Rounded value should be considered equal."); // <-- Fails, because Double.Equals(object) is called!
我已经实现了从RoundedDouble到Double的隐式转换,该转换已经涵盖了很多问题。 但是,如果将RoundedDouble装箱为对象,则会绕过隐式转换。
这个问题在C#中甚至可以解决吗? 还是我达到了编程语言的极限?
盒装比较问题似乎已经是C#v4.0中存在的一个挑战,因为在以下情况下,使用System.Object.Equals(Object)将无法按预期工作:
double oneAsDouble = 1.0;
int oneAsInteger = 1;
Debug.Assert(oneAsDouble.Equals(oneAsInteger)); // Pass
Debug.Assert(oneAsInteger.Equals(oneAsDouble)); // Pass
Debug.Assert(Equals((object)oneAsDouble, (object)oneAsInteger)); // <-- Fails!
Debug.Assert(oneAsDouble.Equals((object)OneAsInteger)); // <-- Fails!
Debug.Assert(oneAsInteger.Equals((object)oneAsDouble)); // <-- Fails!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.