【问题标题】:C# generics and castingC# 泛型和强制转换
【发布时间】:2012-09-05 12:50:04
【问题描述】:

我在我们的代码库中遇到了一个抛出错误的函数:

public static T InternalData<T>()
{
    return (T)"100";
}

显然我已经简化了代码并将“100”添加为文字字符串值。 T 的类型为int。

它抛出一个:

System.InvalidCastException:指定的强制转换无效。

您似乎无法在 C# 中将字符串隐式转换为 int,如何修复此代码以便它可以处理任何泛型类型的转换?

实际代码如下所示:

public static T InternalData<T>()
{
    return (T) something (not sure of type or data);
}

【问题讨论】:

    标签: c# generics casting


    【解决方案1】:

    试试:

    public static T InternalData<T>(object data)
    {
         return (T) Convert.ChangeType(data, typeof(T));
    }
    

    这适用于实现 IConvertible 接口的类型(Int32 和 String 实现了)。

    【讨论】:

    • 我以前从未使用过 ChangeType,不知道该方法存在 - 谢谢 - 现在测试!
    • 太棒了 :) 很高兴我能帮上忙 :)
    【解决方案2】:

    一种可能是使用

    return (T)Convert.ChangeType(yourValue, typeof(T));
    

    请注意,如果yourValue 不是实现IConvertible 的类型的实例,这将引发异常。如果值本身无法转换,它也会抛出异常,例如如果你有“abc”而不是“100”。

    【讨论】:

      【解决方案3】:

      使用Convert.ChangeType。

      public static T InternalData<T>()
      {
          return (T)Convert.ChangeType("100", typeof (T));
      }
      

      如果无法转换值,它仍然会抛出错误,但不会尝试进行直接转换。它可以将字符串转换为整数。

      【讨论】:

        【解决方案4】:

        不要混淆转换和转换!如果编译器不知道表达式的真实类型,例如因为它的类型是object,并且你知道它的固有类型,你可以告诉C#编译器,“嘿,我知道它是int,所以请把它当作int”。

         (int)expression
        

        在您的情况下,表达式是一个字符串表达式,不能转换为int,只是因为它不是int。但是,您可以将字符串转换为 int 如果它表示一个有效的整数。此外,您的转换结果类型是未知的,因为它是通用的。正如其他人已经建议的那样,使用(T)Convert.ChangeType(...)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-02-04
          • 1970-01-01
          • 2010-11-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多