泛型值检查错误

时间:2014-04-19 05:45:54

标签: c# console

此代码在第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();
    }
}

提前致谢

2 个答案:

答案 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在任何意义上都不受约束,因此它可以是stringButton或者double

编译器不知道你是如何使用该类的,并且它不能保证行_no < 0对于放在T中的实际类型有意义(例如,应该{{1}做什么?),所以它发出编译错误。

也就是说,C#没有对数字类型的通用约束,因此没有简单的方法可以执行您想要执行的操作(为所有数字类型创建单个"Hello" < 0方法)。即使你看一下静态absval方法的实现,你会发现它对每一个数字类型都有特定的重载。