关于参数为可空值类型的多个重载的优先级 (彻底晕掉了)
2008-09-24 07:00
218 查看
最近使用ASP.NET MVC Preview 5做个小网站,发现一件很有趣的事情,里面不少地方有这种重载:XXX(string A, object B) 和 XXX(string A, string B),然后就发现了一个好玩儿的问题,再然后,突然冒出个想法,于是有了下面这些:
你猜上面会调用哪个方法?基本上可以恭喜你,大部分人应该都可以猜出来结果是 String,那么下面这个呢?
再次恭喜,哈哈,报错了,String 和 Int32? 不明确,把String换成DateTime?,一样的错误,但是任意一个和Object一起都没有错误,而且都是调用 Object 之外的那个。嗯~~~,是不是只能是 Object 跟一个它派生出来的呢?看下面:
哇咔咔,居然全部和平共处,“优先级”依次是:Int16? -> Int32? -> Int64? -> Single? -> Double?,问题似乎明朗了起来,数字类型的似乎都可以共存,任意一个都可以与 Object 共存。
等等,好像还有一个是数字的,Decimal:
嗯,果然验证了上面的结论,Decimal? 排在 Int64? 之后,呵呵,是不是发现有点不对劲?对了,Single? 和 Double? 不见了~~~~,那是因为~~它俩不能和 Decimal? 在一起,会“不明确”,汗~~~~~~~~
好了,最终结论:
1. 任意一个可为空的值类型都可以与 Object 共存,而不会被认为是错误的不明确的重载,但是 Object 永远不会被调用
2. String、DateTime等无法与其他非 Object 类型作为两个重载,会产生不能明确调用的错误
3. 整型(Int16/Int32/Int64)和浮点数(Single/Double)可以共存,优先级和大家想的一样,整型优先于浮点,小的优先于大的
4. 特殊的数字类型 Decimal 可以与整型共存,而优先级低于整型,但无法与浮点数共存
大家在写程序时应该很容易避免这种问题,但是既然MVC里出来了,那么就应该是有它的用处,那么,谁能告诉我这是为什么?
using System; // 丁学, Ding Xue, http://www.cnblogs.com/dingxue class Program { static void Main(string[] args) { DingXue(null); Console.Read(); } static void DingXue(Object p) { Console.WriteLine("Object"); } static void DingXue(String p) { Console.WriteLine("String"); } }
你猜上面会调用哪个方法?基本上可以恭喜你,大部分人应该都可以猜出来结果是 String,那么下面这个呢?
using System; // 丁学, Ding Xue, http://www.cnblogs.com/dingxue class Program { static void Main(string[] args) { DingXue(null); Console.Read(); } static void DingXue(Object p) { Console.WriteLine("Object"); } static void DingXue(String p) { Console.WriteLine("String"); } static void DingXue(Int32? p) { Console.WriteLine("Int32"); } }
再次恭喜,哈哈,报错了,String 和 Int32? 不明确,把String换成DateTime?,一样的错误,但是任意一个和Object一起都没有错误,而且都是调用 Object 之外的那个。嗯~~~,是不是只能是 Object 跟一个它派生出来的呢?看下面:
using System; // 丁学, Ding Xue, http://www.cnblogs.com/dingxue class Program { static void Main(string[] args) { DingXue(null); Console.Read(); } static void DingXue(Object p) { Console.WriteLine("Object"); } static void DingXue(Int16? p) { Console.WriteLine("Int16"); } static void DingXue(Int32? p) { Console.WriteLine("Int32"); } static void DingXue(Int64? p) { Console.WriteLine("Int64"); } static void DingXue(Single? p) { Console.WriteLine("Single"); } static void DingXue(Double? p) { Console.WriteLine("Double"); } }
哇咔咔,居然全部和平共处,“优先级”依次是:Int16? -> Int32? -> Int64? -> Single? -> Double?,问题似乎明朗了起来,数字类型的似乎都可以共存,任意一个都可以与 Object 共存。
等等,好像还有一个是数字的,Decimal:
using System; // 丁学, Ding Xue, http://www.cnblogs.com/dingxue class Program { static void Main(string[] args) { DingXue(null); Console.Read(); } static void DingXue(Object p) { Console.WriteLine("Object"); } static void DingXue(Int16? p) { Console.WriteLine("Int16"); } static void DingXue(Int32? p) { Console.WriteLine("Int32"); } static void DingXue(Int64? p) { Console.WriteLine("Int64"); } static void DingXue(Decimal? p) { Console.WriteLine("Decimal"); } }
嗯,果然验证了上面的结论,Decimal? 排在 Int64? 之后,呵呵,是不是发现有点不对劲?对了,Single? 和 Double? 不见了~~~~,那是因为~~它俩不能和 Decimal? 在一起,会“不明确”,汗~~~~~~~~
好了,最终结论:
1. 任意一个可为空的值类型都可以与 Object 共存,而不会被认为是错误的不明确的重载,但是 Object 永远不会被调用
2. String、DateTime等无法与其他非 Object 类型作为两个重载,会产生不能明确调用的错误
3. 整型(Int16/Int32/Int64)和浮点数(Single/Double)可以共存,优先级和大家想的一样,整型优先于浮点,小的优先于大的
4. 特殊的数字类型 Decimal 可以与整型共存,而优先级低于整型,但无法与浮点数共存
大家在写程序时应该很容易避免这种问题,但是既然MVC里出来了,那么就应该是有它的用处,那么,谁能告诉我这是为什么?
相关文章推荐
- C#关于参数为null(空值)的方法调用,重载顺序选择彻底研究
- error C2665: 2 个重载中没有一个可以转换所有参数类型
- 关于参数类型的转换问题
- C语言学习4: 函数返回值与传入参数,关于函数值传递和类型隐性转换,变量不同的作用域,static变量,多文件编译例如两个C文件,显示函数调用语句跳转,递归,斐波那契数列,多文件编译相同变量的问题。
- 关于decode参数类型
- 彻底解决springMVC无法接受日期类型参数
- error C2665: “cv::merge”: 3 个重载中没有一个可以转换所有参数类型
- 2 个重载中没有一个可以转换所有参数类型
- 在函数的重载中方法的返回值类型和参数的名字不参加比较
- 关于Java重载方法匹配优先级
- Oracle关于锁的几种类型和参数(转)
- 关于STL中几个比较费解的参数类型
- 提示错误(error C2665: “AfxMessageBox”: 2 个重载中没有一个可以转换所有参数类型)。
- MFC:2个重载中没有一个可以转换所有参数类型
- 关于c#泛类型参数T的约束
- C#只能靠参数而不能靠返回值类型的不同来区分方法重载
- 关于引用构造函数形参和实际参数的数据类型必须一致的实验案例
- 关于为什么匿名内部类参数必须为final类型
- 关于java中类型参数的通配符总结
- 关于SSM中的Controller传递参数的类型的问题