如何在泛型参数上进行四则运算和初识dynamic类型
来源:互联网 发布:广数系统英制螺纹编程 编辑:程序博客网 时间:2024/06/06 18:49
在C#中,泛型<T>仅仅作为占位符,没有实际意义,而通过泛型声明的参数不能进行四则运算,关系运算,逻辑运算,仅仅只能满足赋值操作,即使通过where T : struct来限定参数是值类型,也无法完成运算.
而从目前所学的知识中,可以继承一些特殊的API来完成诸如关系运算.
class Program { public T Comp<T>(T a, T b) where T : struct, IComparable //继承特殊的比较接口IComparable,使用CompareTo方法 { if (a.CompareTo(b) < 0) { return b; } return a; } static void Main(string[] args) { int a = 10; int b = 20; //比较字符串返回较大的那个串 int str = new Program().Comp<int>(a, b); Console.WriteLine(str); Console.ReadKey(); } }而如果需要实现四则运算,发现并没有相应的API可以继承.
那么如何能才能在泛型参数上完成四则运算呢?这里提供两种办法.
第一种可以使用方法重载来完成
class A { public int x; public static A operator +(A a, A b) { A Temp = new A(); Temp.x = a.x + b.x; return Temp; } public override string ToString() { return this.x.ToString(); } } class B<T> where T : A, new() { public void Add(T t1, T t2) { T t3 = (T)(t1 + t2); Console.WriteLine(t3); } } class Program { static void Main(string[] args) { A b1 = new A(); b1.x = 10; A b2 = new A(); b2.x = 20; B<A> bb1 = new B<A>(); bb1.Add(b1, b2); Console.Read(); } }而另一种方法,是参考了FrameWork4.0的新特性dynamic类型,它让C#有了弱语言的特性,在编译器编译时不对类型进行检查.从而让两个泛型类型完成计算并返回运算值.
interface IAlgorthim<T> where T : struct // 约束于值类型 { T Add(T t1, T t2); } class Algorthim<T> : IAlgorthim<T> where T : struct { public T Add(T t1, T t2) { dynamic first = t1, second = t2; //这里用dynamic类型对两个泛型参数进行赋值,能使两个泛型参数进行运算 return first + second; } } class Program { static void Main(string[] args) { IAlgorthim<int> algInteger = new Algorthim<int>(); Console.WriteLine(algInteger.Add(2, 3)); IAlgorthim<double> algDouble = new Algorthim<double>(); Console.WriteLine(algDouble.Add(2.5D, 3.1D)); Console.ReadKey(); } }
虽然在泛型上进行四则运算并无实际意义,而其他方法能更高效得完成运算,但从思考中接触到新的dynamic语句也算是有所收获.
阅读全文
1 0
- 如何在泛型参数上进行四则运算和初识dynamic类型
- 利用dynamic类型对C#泛型参数运算
- UiAutomator初识-在android上进行UiAutomator 测试基本步骤
- 如何在Topcoder上进行比赛
- 如何在topcoder上进行算法比赛
- 如何在C# DateTime类型和JavaScript的Date之间进行转化
- Class的 getSuperclass与getGenericSuperclass区别和如何获取泛型参数类型
- 如何在同一台计算机上的oracle10g和11g之间进行oracle环境切换
- 如何在iOS和Android上选择一个JavaScript 引擎进行应用开发
- 如何在64位操作系统上使用masm进行编译链接和运行
- 如何在github上创建组织并对组织进行管理和团队协作开发项目
- 如何在同一台计算机上的oracle10g和11g之间进行oracle环境切换
- iOS开发技巧之:如何在iOS平台上对一个视频进行解码和显示
- postgresql在json类型上建索引进行测试
- AOP 切面的使用,以及如何在通知上获取切入方法的注解和参数
- 在JSP网页上展示date类型的参数
- dynamic类型,.net命名参数,可选参数列表
- String和StringBuffer类型数据进行参数传递问题
- 表示数值的字符串
- EnterPrise JavaBeans
- MySQL Innodb MTR源码解析
- Android系统中设置TextView的行间距
- HDU 1078 FatMouse and Cheese(记忆化搜索)
- 如何在泛型参数上进行四则运算和初识dynamic类型
- Spring MVC 入门
- DFS水题(HDU2616)
- 【codevs 1081】线段树练习2(单点查询+区间修改)
- 03-kafka配置server.properties
- EasyUi 下拉选择框onchage( )事件
- C++ function templates(1)---《C++ Templates》
- axaj异步查询学习(多级联动、校对信息)
- ubuntu mysql5.7 改变数据目录