问题描述
先看下面这个函数publicstaticTSum<T>(paramsT[]Args){Tsum=Args[0];for(inti=1;i<Args.Length;++i){sum+=Args[i];}returnsum;}
在C++中这是最最基本的函数模板,但是在C#中代码通不过,因为泛型不是模板,它不会生成多份代码,T是当做object来处理的,因此不能用来进行加法运算。但这样的加法泛型是非常有用的,最初的想法当然是使用泛型约束,然而不存在基本数据类型的一个基类或者借口,提供了加法运算。好在C#4.0中添加了动态类型,有关动态类型的表达式都会在运行时求解,这样我们就有可能实现有针对性的加法运算:publicstaticTSum<T>(paramsT[]Args){dynamicsum=Args[0];for(inti=1;i<Args.Length;++i){sum+=Args[i];}returnsum;}
经过测试代码通过了编译,并给出了正确的结果。泪流满面,传说中的矩阵泛型类终于有实现的可能了。
解决方案
本帖最后由 osyxz2011 于 2011-12-17 17:13:36 编辑
解决方案二:
这叫泛型,你说有啥用,类似c++中的模板
解决方案三:
泛型约束能够帮助我们不出错,但有时它又管得太多了,使得它与模板相比有灵活性的缺失,而动态类型就可以突破这个限制,使我们得到类似于模板的体验。
解决方案四:
真能扯。你测试什么了?你拿(比如说)DbConnection类型的对象来来搞+运算了么?你肯定说“用DbConnection来测试这个+运算时吃饱了撑的,不可能给出正确结果”。是的,写出这样的代码其实就是自欺欺人的,你只有在运行时到某个时间才知道有多悲剧,此时已经完了。编写强类型的程序,不是仅仅是为了提高一百倍性能,更主要地是为了保证软件品质!我想你都没有把握住这种原则,你的感觉现在还是“越是野路子越方便”。
解决方案五:
dynamic主要是用在反射上的吧
解决方案六:
引用3楼sp1234的回复:
真能扯。你测试什么了?你拿(比如说)DbConnection类型的对象来来搞+运算了么?你肯定说“用DbConnection来测试这个+运算时吃饱了撑的,不可能给出正确结果”。是的,写出这样的代码其实就是自欺欺人的,你只有在运行时到某个时间才知道有多悲剧,此时已经完了。编写强类型的程序,不是仅仅是为了提高一百倍性能,更主要地是为了保证软件品质!我想你都没有把握住这种原则,你的感觉现在还是……
这确实有问题,如果不能进行+运算那么就会抛出一个Microsoft.CSharp.RuntimeBinder.RuntimeBinderException我做的测试是Sum(1.GetType(),2.GetType());我也想强类型,但这是我所知道的唯一能够对不同类型进行不同加法的方法,你不服的话,我想只能跪求MS推出模板,或者给基本类型实现一个INumber接口。当然如果你编程连异常处理都不愿意做,那我承认我的方法够SB