/// <summary>
        /// 将指定的 Number 类型的值转换成 T 类型的值。
         /// </summary>
        /// <typeparam name="T">转换后的类型。</typeparam>
        /// <param name="number">指定的 Number 类型的值。</param>
        /// <returns>返回转换后的 T 类型的值。</returns>
        internal static T ConvertTo<T>(Number number) where T : struct
        {            number.Validate();
            //return (T)(number.Value);
            return number.boolUseDouble ? (T)number.doubleValue : (T)number.decimalValue; // 这行不对,怎么写?
        }(T)number.doubleValue  这样写编译不对,怎么写?

解决方案 »

  1.   

    这行凭什么对?
    假设T是Point,能把double转成Point吗?能把decimal转成Point吗?
      

  2.   

    类似的问题也一直困扰着我,因为泛型的约束顶多区分值类型和引用类型,而这些“数值类型”又没有一个公共的接口(都直接继承自 Object),没办法将其与非数值类型区分开,想用运算符都不行。目前能想到的是把系统类型包装下,让它们继承自同一接口,不过我也没具体实现过。
      

  3.   

    是的(T)Double这个显式转换不成立,我以前加过is类型判断也不行因为泛型是运行时邦定,编译检查时,它会因为无法确定具体类型而出错(大概是这样的吧)当然解决方案就是不用泛型,写麻烦点.如果非要转换的话,得先再看看MSDN..好象也有介绍吧
      

  4.   


    方法一定要这么写的 internal static T ConvertTo<T>(Number number) 实现怎么实现?
      

  5.   

    如果T类型是.net内建的基本类型(string,int,long等)的话,可以直接利用Convert类,如果不是这些类型会报错
    internal static T ConvertTo<T>(Number number)
    {
      number.Validate();
      if (number.boolUseDouble)
      {
        //ChangeType返回object,object可以被强转成任意类型,所以编译通过
        return (T)Convert.ChangeType(number.doubleValue, typeof(T));
      }
      else
      {
        return (T)Convert.ChangeType(number.decimalValue, typeof(T));
      }
    }
      

  6.   

    谢谢 vwxyzh .....还不知道 Convert.ChangeType 这个方法...一直以为就 Convert.ToXX 这些....谢谢了... +个好友