在尝试返回元组时,对象必须实现IConvertible

Cyb*_*TYK 5 c#

在运行时,我收到以下错误

"对象必须实现IConvertible"

调用功能

lboxBuildingType.SelectedIndex = pharse.returning<int>xdoc.Root.Element("BuildingTypeIndex").Value);

public static T returning<T>(object o)
{
       Tuple<bool, T, object> tmp;
       switch (Type.GetTypeCode(typeof(T)))
       {
        ////blah blah blah
           case TypeCode.Int32:
              tmp= (Tuple<bool,T,object>)Convert.ChangeType(I(o.ToString())), typeof(T)); // error
              break;
        ////blah blah blah
       }
}

private static Tuple<bool, Int32, Object> I(object o)
{
      int i;
      bool b;
      Int32.TryParse(o.ToString(), out i);
      b = (i == 0);
      return new Tuple<bool, Int32, object>(b, i, o);
}
Run Code Online (Sandbox Code Playgroud)

码的目的是在通过<T>("15")并使其产生tuple<Bool,T,object>这将是tuple<true, 15, "15">

它出错了我用//错误标记的地方

Ser*_*rvy 4

ConvertType是一种方法,可让您将实现的对象转换IConvertable为一组固定对象(字符串、数字类型等)之一。它不仅无法将任何IConvertible对象转换为任何类型Tuple(如果您查看该接口的方法你会明白为什么。)但是Tuple你调用它的地方并不IConvertible像错误消息告诉你的那样。

当然,解决方案是ChangeType一开始就不要打电话。它的存在是为了将对象从一种类型转换为另一种类型,但是您拥有的对象已经是正确的类型,您只需通知编译器编译时表达式应该不同,并且您知道该类型将始终匹配运行。您只需使用常规演员即可做到这一点:

tmp = (Tuple<bool,T,object>) (object) I(o.ToString());
Run Code Online (Sandbox Code Playgroud)