C#关于参数为null(空值)的方法调用,重载顺序选择彻底研究
其实这是一个很老的问题了,很久以前就在园子里看到有人对此迷惑,当时也没太在意,觉得哪会有人那么写代码。直到最近丁学君的这篇文章:“关于参数为可空值类型的多个重载的优先级”才让我对这个问题重新有了兴趣。并且做出了一个大胆的猜想,现在这个猜想已经被我验证了。
所有具备单向隐式类型转换或者存在继承关系的类型的方法重载,当使用null值调用时,将会使用隐式类型转换的方向来确定调用哪个方法。
简而言之,假设TypeA和TypeB之间存在一个隐式类型转换或者继承关系,方向是TypeA对象可以隐式转换为TypeB(TypeA存在一个到TypeB的隐式类型转换或者TypeA派生于TypeB)。
又有两个方法的重载如下:
public void MyMethod( TypeA obj ){ … }//重载A
public void MyMethod( TypeB obj ){ … }//重载B
那么MyMethod( null )一定会选择重载A。
但是这还没完,我仔细测定了各种情况的调用情况,并和装配脑袋一起分析整理了一下,还有如下结论:
1、对于Nullable<T>类型而言,T所拥有的运算符(包括隐式类型转换运算符)都会被投射到T?类型。比如说,int有一个隐式类型转换到long,那么int?也就会自动存在一个隐式类型转换到long?。同样的,TypeA?也有一个隐式类型转换到TypeB?(如果TypeA和TypeB是值类型)。这就解释了丁学文章中所说的问题。
2、如果两个类型之间存在双向的隐式类型转换,即TypeA可以隐式类型转换为TypeB,而TypeB也可以隐式类型转换为TypeA,这种情况下,使用null值调用会是一个编译错误。推广开来,如果多个类型之间存在一个闭环的隐式类型转换,比如说TypeA->TypeB,TypeB->TypeC,TypeC->TypeA,那么如果这三个类型的重载都存在的话,使用null值调用同样的编译错误,但是如果只有两个类型的重载存在(即方法重载的参数类型不存在闭环)那么也不会有错误。
3、数组的协变也会被看作是一个隐式类型转换,比如说TypeA派生于TypeB,则TypeA[]存在一个到TypeB[]的隐式转换,这个被称之为数组的协变。那么这个隐式转换也会被这个规则采信,即如果两个方法的参数是TypeA[]和TypeB[]的话,采用null值调用会选择TypeA[]的重载。
4、VB中也采用类似的规则,这一点有待装配脑袋的确认。
C#关于参数为null(空值)的方法调用,重载顺序选择彻底研究相关推荐
- java方法的参数类型_Java 基础 14 方法的重载 与 方法参数类型详解
1.1 方法重载的概述和特点 方法重载概述 在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数类型不同即可. 方法重载特点 与返回值类型无关,只看方法名和参数列表 在调用时,虚拟机通 ...
- java继承链中方法调用优先级.顺序:this.show(object)super.show(object)this.show((super)object)super.show((super))
先看代码如下: 运行结果 在上述代码中,类B继承了类A,类C继承了类B,A中show()方法发生了重载,B中重写了A中的show(C )方法. 这里先说一下向上造型的一个知识点:向上造型时,编译期时根 ...
- 【JavaSE05】Java中方法与重载、递归
1.方法的声明和调用 什么是方法?为什么需要方法?代码复用,方便软件升级 什么是方法? 具备特定功能的一段独立的代码段 标准的方法格式:(注意格式的顺序) 修饰符 返回值类型 方法名(参数类型 参数名 ...
- java多态调用优先级_关于java的多态方法调用顺序的问题
使用父类类型的引用指向子类的对象,该引用调用的师父类中定义的方法和变量,变量不能被重写(覆盖):如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法: 注意特殊情况,如 ...
- 方法的重载(overload)和重写(override)的区别
方法的重写Overriding和重载Overloading是Java多态性的不同表现.重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现.如 ...
- java数组循环动态赋值_04、Java基础语法(循环嵌套、break、continue、方法、方法的重载、数组动态初始化)...
复习: 流程控制语句 - 顺序结构 - 分支结构 - if-else - switch - 循环结构 - for - while - do...while ctrl + alt + L 格式化代码 & ...
- java系列2:方法的重载
对于功能类似的方法来说,因为参数列表不一样,但却需要记住多个不同的方法名称,太麻烦了. 如下面这个例子,不同个数的相加的方法们方法类似,但参数列表不一样,按理说说方法名称应该不同,因为可能不知道调用的 ...
- laytpl语法_浅谈laytpl 模板空值显示null的解决方法及简单的js表达式
浅谈laytpl 模板空值显示null的解决方法及简单的js表达式 laytpl 模板语法 {{ d.field }} 输出一个普通字段,不转义html 官方的说明 但d.field 为空时会显示nu ...
- mockito+junit 单元测试 测试私有方法利用反射去调用提升覆盖率 反射调用时传入参数为 null
今天公司安排我写单元测试 因为要通过三级认证 公司要求是覆盖率必须达到100% 而在写单元测试的时候 对于是否要测试私有方法一直是一个争议 公司规范 对私有方法也进行测试 代码如下: private ...
最新文章
- Java如何执行操作系统的CMD命令行
- tensorflow loss nan 解决办法
- 吴恩达机器学习 -- 正则化
- 函数sprintf真好用
- 2018年90后薪资报告出炉:你在哪个级别???
- 计算机基础八进制和十六进制试题,计算机基础知识考试试题
- 大数据分块_谷歌卫星影像金字塔分块下载原理说明
- win10wifi间歇性断网重启后恢复_实用!Xbox Series X 在重启后也能快速恢复之前的游戏状态...
- 《Linux Shell脚本攻略》读书笔记第二章 命令之乐
- python参考手册 第二章
- c语言编译器手机版显示错误,C语言编译器的错误信息
- 电脑怎么彻底卸载程序
- office word安装mathtype报错,找不到mathpage.WLL文件
- 小草与大树的一分钟演讲
- python pdf删除图片_【原创】python批量删除pdf图片水印(Xobject)的一种方法
- 【腾讯云新知实验室】一站式提供视频解决方案
- 解决银河麒麟系统开机后桌面无图标,只有下方开始菜单和任务栏可操作问题
- mysql优化之query_cache_type的DEMAND参数介绍
- Power BI Paginated Reports分页报表
- 米筐量化如何安装使用?
热门文章
- Win64 驱动内核编程-12.回调监控进线程创建和退出
- hdu3374最小表示法+KMP
- hdu4302 set或者线段树
- 【Google Play】正式版上架流程 ( 创建版本 | 设置国家地区 | 发布正式版 )
- 【Android 安装包优化】APK 打包流程 ( 文件结构 | 打包流程 | 安装流程 | 安卓虚拟机 )
- 关于MyEclipse连接SQLServer和Mariadbsql
- mybatis08--关联查询多对一
- 对象及变量的并发访问一
- LAMBDA表达式常用 (全)
- 汇编语言随笔(8)-实验9(显示字符串)、实验10(子程序:除法溢出,数值到字符串的转换)和课程设计1