如果我这样说,无论出于什么原因,都要在浮点类型周围创建一个薄的包装器,如下所示:
new WrappedFloat(4.0F) + new WrappedFloat(3.0F)
此代码显然完全有效:
WrappedFloat
由于float
没有定义任何算术运算符,因此必须有一些关于它的隐式转换CompareTo
允许这样做。但是运算符重载只是方法的语法糖,对吧?我不能仅仅因为WrappedFloat
拥有它们而在float
上调用方法(即{{1}})。那么这里的运营商有什么特别之处呢?允许这样做的规则是什么?
答案 0 :(得分: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; }
//...
现在想象你有:
Plus(new WrappedFloat(4.0F), new WrappedFloat(3.0F));
你期望在这里发生什么?过载分辨率会运行,它会看到有一个重载,两个参数都有一个隐式转换,并且重载(接受float
值)成为唯一的最佳匹配。
运营商也会发生同样的事情。它将所有重载拉到一起,查看哪些具有可以隐式转换为提供的参数的参数列表,然后如果存在多个,则选择它们之间的最佳匹配。
答案 1 :(得分:0)
但是运算符重载只是方法的语法糖,对吧?
对于"方法"它不是语法糖,它是以特定方式实现的一种方法的语法糖。对具有.
语法的对象的典型方法调用在此处不适用。 MS选择了一种方便程序员的设计。当我打电话
wrappedFloat.Method()
我不希望它在wrappedFloat
上寻找所有可能性,但当我做
wrappedFloat1 + wrappedFloat2
我期待它。我在这里同意MS。这里的一个区别是,在第一种情况下,它是对实例的调用,第二种是静态方法调用,其中形式参数作为参数传递。