C#编译器如何处理重载显式强制转换运算符?

亚历克斯·斯科

编译器应翻译以下代码:

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)
...

但是,我们不允许使用仅在返回类型上有所不同的方法。幕后发生了什么?

Xanatos

从技术上讲,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指令必须支持它:-)

例如http://goo.gl/CS4FPb

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用重载的显式转换运算符?

编译器如何为实数文字选择隐式运算符重载

编译器如何调用运算符转换?

编译器如何知道是使用成员运算符重载还是使用全局运算符重载?

C ++编译器如何区分*运算符的用法?

当指定类型的运算符重载存在时,C#编译器如何确定泛型方法中的引用相等性?

为什么 C# 编译器不调用隐式运算符。编译错误?

不同的编译器调用不同的强制转换运算符

如何显式调用运算符<<的模板重载?

如何使用Gnu编译器在VxWorks 7中重载新/删除运算符

C ++编译器如何区分*运算符(指向或解引用运算符或乘法运算符)的用途?

Raku mixin 如何处理运算符重载?

隐式运算符和编译器错误

转换运算符的离线定义的编译器差异

C / C ++中的显式类型转换运算符

编译器如何使用后缀运算符处理return语句?

如何快速定义显式转换运算符?

运算符重载和函数重载产生不明确的编译器错误

C ++类,隐式转换和运算符重载

重载转换运算符时,何时使用关键字“隐式”或“显式”?

显式转换运算符bool

如何强制运算符>>(C <T>)重载以匹配容器?

像C#这样的Dart显式运算符?

C#显式运算符和对象

C ++编译器是否将所有后缀运算符重载都视为相同(-和-的后缀版本)?

C / C ++编译器如何区分*运算符(指向或解引用运算符或乘法运算符)的用途?

C / C ++编译器如何区分*运算符(指针,解引用运算符,乘法运算符)的用法?

使用“静态隐式运算符”进行C#强制转换问题

为什么VC ++编译器在复合运算符重载时给出错误?