此代码在第11行和第13行出现错误,错误消息为错误“操作员”<'不能应用于'T'和'int'类型的操作数 如何检查值并以其他方式打印
class absval<T>
{
private T _no;
public void storeval(T x)
{
this._no = x;
}
public T getval()
{
if(this._no<0)
{
return (this._no*-1);
}
}
}
class Program
{
static void Main(string[] args)
{
absval<int> a1 = new absval<int>();
absval<double> a2 = new absval<double>();
a1.storeval(-20);
a2.storeval(-20.4);
Console.WriteLine("{0} {1}",a1.getval(),a2.getval());
Console.ReadLine();
}
}
提前致谢
答案 0 :(得分:1)
只要您没有高精度数字转换错误的危险,您就可以使用数字IConvertible实现来获得通用方法。虽然前者可能在微观层面上更有效率,但它看起来比实现很多if和elses更清晰。
public T getval()
{
if(_no is IConvertible) //could also be put in the generic constraint for <T>
{
//use decimal for the largest precision,
var dec = Convert.ToDecimal(_no); //will throw an exception if not numeric
if (dec < 0)
{
return (T)Convert.ChangeType(-dec, typeof(T));
}
}
return _no;
}
答案 1 :(得分:0)
嗯,_no
的类型为T
,其中T
在任何意义上都不受约束,因此它可以是string
,Button
或者double
。
编译器不知道你是如何使用该类的,并且它不能保证行_no < 0
对于放在T
中的实际类型有意义(例如,应该{{1}做什么?),所以它发出编译错误。
也就是说,C#没有对数字类型的通用约束,因此没有简单的方法可以执行您想要执行的操作(为所有数字类型创建单个"Hello" < 0
方法)。即使你看一下静态absval
方法的实现,你会发现它对每一个数字类型都有特定的重载。