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有它们.那么这里的运营商有什么特别之处呢?允许这样做的规则是什么?
出于本讨论的目的,运算符就像静态方法一样.想象一下,每个运算符重载都有一个实际的静态方法:
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值)成为唯一的最佳匹配.
运营商也会发生同样的事情.它将所有重载拉到一起,查看哪些具有可以隐式转换为提供的参数的参数列表,然后如果存在多个,则选择它们之间的最佳匹配.
| 归档时间: |
|
| 查看次数: |
186 次 |
| 最近记录: |