在C#中重载=运算符

Max*_*kov 17 c# overloading operator-keyword

好的,我知道这是不可能的,但这是制定问题标题的最佳方式.问题是,我正在尝试使用我自己的自定义类而不是浮点数(用于确定性模拟),我希望语法尽可能接近.所以,我当然希望能够写出类似的东西

FixedPoint myNumber = 0.5f;
Run Code Online (Sandbox Code Playgroud)

可能吗?

fer*_*ero 33

是的,通过为FixedPoint此类编写的隐式类型转换运算符创建.

class FixedPoint
{
    public static implicit operator FixedPoint(double d)
    {
        return new FixedPoint(d);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果读者/编码器对a double可以转换为不明显FixedPoint,您也可以使用显式类型转换.然后你必须写:

FixedPoint fp = (FixedPoint) 3.5;
Run Code Online (Sandbox Code Playgroud)

  • 好吧,它实际上不会重载`=`运算符,它只会引入一个强制转换.如果你将它定义为一个显式的强制转换,你就有:`FixedPoint myNumber =(FixedPoint)0.5f;`.你最初仍然会有一个浮点数,但它会被自动转换为一个FixedPoint.请注意,这意味着您仍然会有浮点表示的舍入错误:您实际上无法读取*literal*`0.1f`,您仍然会收到一个浮点数,它最能代表二进制重复数`0.1 `作为重载方法的参数. (3认同)

cuo*_*gle 8

重载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;
    }
}
Run Code Online (Sandbox Code Playgroud)

所以你可以使用:

FixedPoint fp = 1;
float f = fp;
Run Code Online (Sandbox Code Playgroud)

  • 第二个隐式运算符也是一个很好的补充!谢谢. (2认同)