public static T GetKeyValue<T>(string settingType, string settingKey, T defaultValue)
        {
            object keyValue = null;
            keyValue = fun(); //这个fun()返回的是string类型            if (keyValue == null || string.IsNullOrEmpty(keyValue.ToString()))
                return defaultValue;            try
            {
                return (T)keyValue;   //这儿出错
            }
            catch
            {
                return defaultValue;
            }
        }
在调用时,如果转为int型,则上面的return (T)keyValue;  出错,若为字符型,则正常:
GetKeyValue<int>("ftp", "port", 20);  //(T)keyValue 无法将“keyValue”作为“T”取消装箱 int
GetKeyValue<string>("ftp", "password", "1111");   //这是正常的
已经是object了,进行强制转换,为什么非string型都不可以呢????
后来用Convert.ChangeType转换解决问题了,但不明白上面的强制转换不行.

解决方案 »

  1.   

    尝试对 null 或对不兼容值类型的引用进行取消装箱操作,将导致 InvalidCastException。

    string s= "123";  
    object o = i;  
    string j = (string)o;则可以
      

  2.   

    你既然强转,还要泛型干什么?应该T keyValue = default(T);
    fun函数应该是private T fun<T>()
    {}
    这样声明,既然用了泛型,就贯彻到底,否则不如还是强转。
      

  3.   

    to wjq:
    我那个fun是从数据库中读出来的配置值,数据库中存的是nvarchar型,里面的值可以是数字"20",也可以是字符"username",还可能是其他类型。
    所以fun返回是string型。
      

  4.   

    既然明确知道fun返回字符串类型,就没必要用泛型。
    函数既是判断fun返回值是否为空,为空时返回默认值;否则返回fun的值。
    有关类型转换,如青龙白虎说的:
      强制类型转换是拆箱的过程,并不是你想象的转换数据类型,只不过是一个被装过箱为基类的对象强制转换为子类对象,也就是必须保证拆箱后的对象必须是装箱前的对象,否则转换必然报错。
      

  5.   

    既然fun返回string,你的keyvalue为什么要是object。首先fun返回字符串,它实际表示数字还是什么另外再说,你想要把字符的"20"强转成int20是不可能的。
      

  6.   

    你想要把字符的"20"强转成int20是不可能的。
    ------------
    我以为(T)keyValue可以转换。后来我这样处理了:
            public static T GetKeyValue<T>(string settingType, string settingKey, T defaultValue)
            {
                string keyValue = fun();            if (keyValue == null || string.IsNullOrEmpty(keyValue.ToString()))
                    return defaultValue;            try
                {
                    object ConvertTemp = Convert.ChangeType(keyValue, typeof(T));
                    return (T)ConvertTemp;
                }
                catch
                {
                    return defaultValue;
                }
            }
      

  7.   

    To net205:
    如果你用反射测试下下面给你的代码,应该就会很容易理解的了。object keyValue = null;
    keyValue = fun(); 
    if(keyValue.GetType() == typeof(string))//这里成立
        MessageBox.Show("keyValue是string类型");
    if(keyValue.GetType() == typeof(object))//这里不成立
        MessageBox.Show("keyValue是object类型");