我想这样,让一个方法,根据传入不同的值类型做不同的处理。
-------------------------------------------------------
public Tinput1 Compute<Tinput1,Tinput2>(Tinput1 t1,Tinput2 t2)
{
if (t1 is int&&t2 is int)
{
t1 = (int)t1;
t2 = (int)t2;
t1 = t1 + t2;
}
else if (t1 is string&&t2 is string)
{
t1 = (string)t1;
t2 = (string)t2;
t1 = t1 + t2;
}
else if (t1.GetType().IsSubclassOf(typeof(object)))
{
this.b = t1.Equals(t2);
t1 = (bool)t1;
t1 = Convert.ToInt32(this.b);
}
return t1;
}但是出现8个错误,不能t1 = (int)t1;t2 = (int)t2;t1 = (string)t1;t1 = t1 + t2;等,那有什么办法 让它可以呢?
-------------------------------------------------------
public Tinput1 Compute<Tinput1,Tinput2>(Tinput1 t1,Tinput2 t2)
{
if (t1 is int&&t2 is int)
{
t1 = (int)t1;
t2 = (int)t2;
t1 = t1 + t2;
}
else if (t1 is string&&t2 is string)
{
t1 = (string)t1;
t2 = (string)t2;
t1 = t1 + t2;
}
else if (t1.GetType().IsSubclassOf(typeof(object)))
{
this.b = t1.Equals(t2);
t1 = (bool)t1;
t1 = Convert.ToInt32(this.b);
}
return t1;
}但是出现8个错误,不能t1 = (int)t1;t2 = (int)t2;t1 = (string)t1;t1 = t1 + t2;等,那有什么办法 让它可以呢?
t2 = (int)t2;
t1 = t1 + t2;=====>return (int)t1 + (int)t2;
public object Compute(object t1,object t2);不过是批一件没有意义的泛型的皮. 泛型的好处是把类型检查提前到了编译时,但是你在运行的时候执行了这么多的 is 啊强制转换啊.....而且最后那个else逻辑明显有问题 t1 = (bool)t1;
从哪里让你觉得这个语句可以执行成功了?
public string Compute(string t1,string t2){return t1+t2; }
..............这维护起来并不比你这么一堆if-else要复杂(我觉得应该还更容易),而且代码每个只有1行,又不用类型检查,明显写3个重载比你写这个"假的" 泛型方法要好的多.你也许要说如果类型有100种,难道要写100个重载啊? 那你如果类型100种的话,100个重载虽然有问题,也比你一个方法里一个100个分支的if语句要更好. 横竖都不是你这种写法.
http://studycs.com/ShowArticle.aspx?id=371
http://birdshover.cnblogs.com/articles/392127.html原方法的意思,大概表述有误,因为用一个泛型参数就够了如下: public T Compute<T>(T t1,T t2) where T :struct
{
if (t1 is int)
{
int i = 0;
i = t1 + t2;
}
else if(t1 is string)
{
//例如比较输出较短的长度的string值。
}
return t1;
}但这还是错的,因为,原因t1+t2这样的表达不能通过编译,因为,经考查理解了,泛型,只是一个“占位标志”在运行时通过其自身的元数据(这方面我不太懂)在IL中间语言中的处理,为具体类型的,所以这里它仍然仅是一个占位标志,无法使用很多,运算号。////////////////////////////////////////////////////////////////////////////
还有一个问题一起问了,就是
假如我有多个泛型参数,如void M<T1,T2,T3>(T1 t1,T2 t2)//这里我要约束T1,T2,T3该如何来写where,我只见过后面跟一个泛型的情况,如 where T1:ImyInterface 等,
void M<T1,T2>(T1 t)
where T1 :class
where T2 :struct
{
}
【IT168 技术教程】
泛型简介
所谓泛型:即通过参数化类型来实现在同一份代码上操作多种数据类型。泛型编程是一种编程范式,它利用“参数化类型”将类型抽象化,从而实现更为灵活的复用。C#泛型赋予了代码更强的类型安全,更好的复用,更高的效率,更清晰的约束。
C#泛型演示
class Stack<T>
{
private T[] store;
private int size
public Stack()
{
store = new T[10];
size = 0;
}
public void Push(T x)
{
store[size++] = x;
}
public void T Pop()
{
return store[--size];
}
}
Stack<int> x = new Stack<int>();
x.Push(17);
C#泛型机制简介
C#泛型能力由CLR在运行时支持,区别于C++的编译时模板机制,和java的编译时的“搽拭法”。这使得泛型能力可以在各个支持CLR的语言之间进行无缝的互操作。
C#泛型代码在被编译为IL和元数据时,采用特殊的占位符来表示泛型类型,并用专有的IL指令支持泛型操作。而真正的泛型实例化工作以“on-demand”的方式,发生在JIT编译时。
C#泛型编译机制
第一轮编译时,编译器只为Stack<T>类型产生“泛型版”的IL代码和元数据,并不进行泛型类型的实例化,T在中间只充当占位符。JIT编译时,当JIT编译器第一次遇到Stack<int>时,将用int类型替换“泛型版”IL代码与元数据中的T -- 进行泛型类型的实例化。CLR为所有类型参数为“引用类型”的泛型类型产生同一份代码,但如果类型参数为“值类型”,对每一个不同的“值类型”,CLR将为其产生一份独立的代码 在这儿记录一下(网摘)