编译器应翻译以下代码:
public static explicit operator Int64(MyNumber n)
{
return n.ToInteger();
}
public static explicit operator Double(MyNumber n)
{
return n.ToDouble();
}
两种具有相同名称和签名但仅在返回类型上有所不同的方法,例如
public static Int64 ExplicitCast(MyNumber n)
...
public static Double ExplicitCast(MyNumber n)
...
但是,我们不允许使用仅在返回类型上有所不同的方法。幕后发生了什么?
从技术上讲,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)
与
call float64 MyNumber::op_Explicit(class MyNumber)
请注意,CLS通常仅根据返回类型禁止重载...但是op_Implicit
(隐式强制转换运算符)和op_Explicit
(显式强制转换运算符)(来自同一ECMA-335文件)有一个例外:
CLS规则38:只能根据参数的数量和类型来重载属性和方法,但名为op_Implicit和op_Explicit的转换运算符除外,它们也可以根据其返回类型而被重载。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句