隐式转换如何与运算符重载一起使用?

Alp*_*der 3 c# operator-overloading implicit-conversion

比方说,如果我出于某种原因在float类型周围创建一个薄包装器,如下所示:

public class WrappedFloat
{

    private float value;

    public WrappedFloat(float value)
    {
        this.value = value;
    }

    public static implicit operator float(WrappedFloat wrapped)
    {
        return wrapped.value;
    }

    public static implicit operator WrappedFloat(float value)
    {
        return new WrappedFloat(value);
    }

}
Run Code Online (Sandbox Code Playgroud)

这段代码显然是完全有效的:

new WrappedFloat(4.0F) + new WrappedFloat(3.0F)
Run Code Online (Sandbox Code Playgroud)

由于WrappedFloat没有定义任何算术运算符,因此必须有一些关于它的隐式转换以float允许它.但是运算符重载只是方法的语法糖,对吧?这不像我可以调用方法(即CompareTo)WrappedFloat因为float有它们.那么这里的运营商有什么特别之处呢?允许这样做的规则是什么?

Ser*_*rvy 5

出于本讨论的目的,运算符就像静态方法一样.想象一下,每个运算符重载都有一个实际的静态方法:

public static int Plus(int a, int b) { return a + b; }
public static float Plus(float a, float b) { return a + b; }
public static long Plus(long a, long b) { return a + b; }
public static string Plus(string a, string b) { return a + b; }
public static double Plus(double a, double b) { return a + b; }
//...
Run Code Online (Sandbox Code Playgroud)

现在想象你有:

Plus(new WrappedFloat(4.0F), new WrappedFloat(3.0F));
Run Code Online (Sandbox Code Playgroud)

你期望在这里发生什么?过载分辨率会运行,它会看到存在一个重载,两个参数都有一个隐式转换,并且重载(接受float值)成为唯一的最佳匹配.

运营商也会发生同样的事情.它将所有重载拉到一起,查看哪些具有可以隐式转换为提供的参数的参数列表,然后如果存在多个,则选择它们之间的最佳匹配.