好的,我知道这是不可能的,但这是提出问题标题的最佳方式。问题是,我想使用自己的自定义类而不是float(用于确定性模拟),并且我希望语法尽可能接近。因此,我肯定希望能够编写类似以下的内容:
FixedPoint myNumber = 0.5f;
可能吗?
好的,我知道这是不可能的,但这是提出问题标题的最佳方式。问题是,我想使用自己的自定义类而不是float(用于确定性模拟),并且我希望语法尽可能接近。因此,我肯定希望能够编写类似以下的内容:
FixedPoint myNumber = 0.5f;
可能吗?
如果您编写了这个类,那么可以通过为FixedPoint
创建一个隐式类型转换运算符来实现。
class FixedPoint
{
public static implicit operator FixedPoint(double d)
{
return new FixedPoint(d);
}
}
如果读者/编码人员不明显知道一个 double
可以转换为 FixedPoint
,您也可以使用显式类型转换。此时您需要编写:
如果读者/编码人员不明显知道一个 double
可以转换为 FixedPoint
,您也可以使用显式类型转换。此时您需要编写:
FixedPoint fp = (FixedPoint) 3.5;
=
操作符超载,它只会引入一个类型转换。如果您定义为显式强制类型转换,则会有:FixedPoint myNumber = (FixedPoint) 0.5f;
。一开始仍然是一个浮点数,但它将被自动转换为FixedPoint类型。请注意,这意味着您仍然会受到来自浮点数表示的舍入误差:您实际上无法读取文字 0.1f
,您将收到最能表示二进制重复数字0.1
的浮点数作为重载方法的参数。 - Mattias Buelens=
运算符。Fero建议的是处理将FixedPoint转换为另一种类型的操作。 - Security Hound重载 implicit
转换运算符:
class FixedPoint
{
private readonly float _floatField;
public FixedPoint(float field)
{
_floatField = field;
}
public static implicit operator FixedPoint(float f)
{
return new FixedPoint(f);
}
public static implicit operator float(FixedPoint fp)
{
return fp._floatField;
}
}
FixedPoint fp = 1;
float f = fp;
创建一个隐式类型转换。
这是一个例子:
<class> instance = new <class>();
float f = instance; // We want to cast instance to float.
public static implicit operator <Predefined Data type> (<Class> instance)
{
//implicit cast logic
return <Predefined Data type>;
}
public static explicit operator FixedPoint(float oc)
{
FixedPoint etc = new FixedPoint();
etc._myValue = oc;
return etc;
}
... usage
FixedPoint myNumber = (FixedPoint)0.5f;
decimal
仍然是一种浮点类型。它只是使用128位而不是32/64位,并且使用十进制指数而不是二进制指数。 - Joren