Ale*_* Sk 6 c# compiler-construction
编译器应该翻译这段代码:
public static explicit operator Int64(MyNumber n)
{
return n.ToInteger();
}
public static explicit operator Double(MyNumber n)
{
return n.ToDouble();
}
Run Code Online (Sandbox Code Playgroud)
两个方法具有相同的名称和签名,但只有它们的返回类型不同,例如
public static Int64 ExplicitCast(MyNumber n)
...
public static Double ExplicitCast(MyNumber n)
...
Run Code Online (Sandbox Code Playgroud)
但是,我们不允许只有返回类型的方法.窗帘后面会发生什么?
从技术上讲,CLS(公共语言规范,指定所有.NET语言应该支持的.NET虚拟机的子部分的规范)表示显式强制转换方法的名称应该是op_Explicit(参见例如http:// goo. gl/wn8dHq).
您不能拥有多个具有相同名称且只有不同返回类型的方法的限制是C#的限制.IL语言(即.NET虚拟机的语言)没有此限制.
例如,请参阅:https://stackoverflow.com/a/442100/613130
但是,某些语言(例如MSIL)允许通过返回类型进行重载.他们当然也面临上述困难,但他们有解决方法,你必须查阅他们的文档.
和https://blogs.msdn.microsoft.com/abhinaba/2005/10/07/c-cil-supports-overloading-by-return-type/
但是,CIL确实支持通过返回类型重载方法,即使C#,VB没有.实现转换运算符重载C#编译器使用此功能(我知道一种用法,我确信还有更多:))
(这就是这里提到的情况)
如果您想查看ECMA-335标准:
I.8.11.1方法定义
方法签名定义了调用约定,方法的参数类型以及方法的返回类型
如果您有兴趣知道如何调用该方法......那么......很明显,如果IL语言支持返回类型的重载,那么它的call指令必须支持它:-)
call int64 MyNumber::op_Explicit(class MyNumber)
Run Code Online (Sandbox Code Playgroud)
VS
call float64 MyNumber::op_Explicit(class MyNumber)
Run Code Online (Sandbox Code Playgroud)
请注意,CLS通常仅根据返回类型禁止重载...但它有op_Implicit(隐式转换运算符)和op_Explicit(显式转换运算符)(来自相同的ECMA-335文件)的异常:
CLS规则38:属性和方法可以仅根据其参数的数量和类型进行重载,但名为op_Implicit和op_Explicit的转换运算符除外,它们也可以根据其返回类型进行重载.