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

时间:2015-10-09 17:42:51

标签: c# operator-overloading implicit-conversion

如果我这样说,无论出于什么原因,都要在浮点类型周围创建一个薄的包装器,如下所示:

new WrappedFloat(4.0F) + new WrappedFloat(3.0F)

此代码显然完全有效:

WrappedFloat

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

2 个答案:

答案 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。这里的一个区别是,在第一种情况下,它是对实例的调用,第二种是静态方法调用,其中形式参数作为参数传递。