读书人

泛型使用有关问题

发布时间: 2011-12-19 23:23:36 作者: rapoo

泛型使用问题
我想这样,让一个方法,根据传入不同的值类型做不同的处理。
-------------------------------------------------------
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;等,那有什么办法 让它可以呢?


[解决办法]
t1 = (int)t1;
t2 = (int)t2;
t1 = t1 + t2;

=====>

return (int)t1 + (int)t2;
[解决办法]
你的代码中都没用上泛型....你的方法实际上是
public object Compute(object t1,object t2);

不过是批一件没有意义的泛型的皮. 泛型的好处是把类型检查提前到了编译时,但是你在运行的时候执行了这么多的 is 啊强制转换啊.....

而且最后那个else逻辑明显有问题

t1 = (bool)t1;
从哪里让你觉得这个语句可以执行成功了?

[解决办法]
你这种情况不要用泛型,用方法重载不管在执行效率上还是维护性上都更好

[解决办法]
public int Compute(int t1,int t2){return t1+t2; }
public string Compute(string t1,string t2){return t1+t2; }
..............

这维护起来并不比你这么一堆if-else要复杂(我觉得应该还更容易),而且代码每个只有1行,又不用类型检查,明显写3个重载比你写这个 "假的 " 泛型方法要好的多.


你也许要说如果类型有100种,难道要写100个重载啊?

那你如果类型100种的话,100个重载虽然有问题,也比你一个方法里一个100个分支的if语句要更好. 横竖都不是你这种写法.

读书人网 >C#

热点推荐