Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 重载=C中的运算符#_C#_Overloading_Operator Keyword - Fatal编程技术网

C# 重载=C中的运算符#

C# 重载=C中的运算符#,c#,overloading,operator-keyword,C#,Overloading,Operator Keyword,好吧,我知道这是不可能的,但这是最好的方式来制定问题的标题。问题是,我试图使用自己的自定义类而不是float(用于确定性模拟),我希望语法尽可能接近。所以,我当然希望能够写出这样的东西 FixedPoint myNumber = 0.5f; 是否可能?是的,如果该类是由您编写的,则为FixedPoint创建隐式类型转换运算符 class FixedPoint { public static implicit operator FixedPoint(double d) {

好吧,我知道这是不可能的,但这是最好的方式来制定问题的标题。问题是,我试图使用自己的自定义类而不是float(用于确定性模拟),我希望语法尽可能接近。所以,我当然希望能够写出这样的东西

FixedPoint myNumber = 0.5f;

是否可能?

是的,如果该类是由您编写的,则为
FixedPoint
创建隐式类型转换运算符

class FixedPoint
{
    public static implicit operator FixedPoint(double d)
    {
        return new FixedPoint(d);
    }
}
如果读者/编码者不清楚
double
可以转换为
FixedPoint
,也可以使用显式类型转换。然后你必须写:

FixedPoint fp = (FixedPoint) 3.5;

创建隐式类型转换

这是一个例子:

<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>;
}
instance=new();
float f=实例;//我们希望将实例强制转换为浮动。
公共静态隐式运算符(实例)
{
//隐式转换逻辑
返回;
}

如果在=重载中隐式运算符不是您想要的,另一个选项是在类上使用显式运算符,如下面所示,该运算符将强制转换到该类,以使用户能够理解它:

public static explicit operator FixedPoint(float oc)     
{         

     FixedPoint etc = new FixedPoint();          
     etc._myValue = oc;          
     return etc;      
}

... usage

FixedPoint myNumber = (FixedPoint)0.5f;

重载
隐式
强制转换运算符:

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;

想举个例子吗?因为文档清楚地表明“=”不是一个可重载的操作符。好吧,它实际上不会重载
=
操作符,它只会引入一个强制转换。如果将其定义为显式强制转换,则会有:
fixedpointmynumber=(FixedPoint)0.5f。一开始你仍然会有一个浮动,但它会自动转换为一个固定点。请注意,这意味着您仍然会有来自浮点表示的舍入错误:您实际上无法读取文本
0.1f
,您仍然会收到一个最能表示二进制重复数
0.1
的浮点数,作为重载方法的参数。@Marc AndréJutras重载=不可能,这不是超载:)@Marc AndréJutras什么?它不是这么说的。@Marc AndréJutras-Fero没有建议在这种情况下重载
=
操作符。Fero建议他们处理将定点转换为另一种类型的操作。只是为了确保:您知道C#已经包含一种称为?@Heinzi:
decimal
的固定精度数据类型仍然是浮点类型。它只使用128位而不是32/64位,用十进制指数而不是二进制指数。@Joren:当然,很抱歉,我只是想简洁一些。我想写的是:“如果使用自定义定点数据类型来避免通常与二进制浮点数据类型相关的舍入问题,则可以考虑使用十进制代替,它能够精确地表示十进制浮点数字。如果您已经考虑并拒绝了该选项,请忽略此评论。“@Heinzi decimal应该比integer math慢(我的定点本质上是)。@golergka:啊,好的,有道理!第二个隐式运算符也是一个很好的加法!谢谢。