【问题标题】:Unbox a number to double拆箱一个数字加倍
【发布时间】:2014-06-25 21:55:19
【问题描述】:

是否存在将未知数字转换为双倍的方法?例如

    public static double Foo(object obj)
    {
        if (!obj.GetType().IsValueType)
            throw new ArgumentException("Argument should be a number", "obj");
        return (double) obj;
    }

    private static void Main(string[] args)
    {
        double dbl = 10;
        decimal dec = 10;
        int i = 10;
        short s = 10;
        Foo(dbl);
        Foo(dec);
        Foo(i);
        Foo(s);
    }

但此代码在尝试将其拆箱为不正确的类型时会引发异常。

【问题讨论】:

  • 你为什么期望所有值类型都可以转换为double?请注意,枚举或结构也是值类型。
  • 你为什么不用Convert.ToDouble
  • @TimSchmelter 因为.Net 没有简单的方法来确定某个类是否为数字。无论如何,这只是一个例子,一个不起作用的例子。
  • @EKrueger,我忘记了 Convert 适用于对象。而不是我会使用它。 Tnx。
  • @AshtonWoods 它将为除 double 之外的任何类型抛出异常。例如,将整数 10 传递给方法也会抛出异常。

标签: c# .net boxing unboxing


【解决方案1】:

最简单的方法可能是使用Convert.ToDouble。这会为您完成转换,并适用于数字类型、strings 以及实现 IConvertible 的任何其他类型(并且具有可以转换为 double 的值)。

public static double Foo(object obj)
{
    // you could include a check (IsValueType, or whatever) like you have now,
    // but it's not generally necessary, and rejects things like valid strings
    return Convert.ToDouble(obj);
}

【讨论】:

  • 这正是我一直在寻找的。肿瘤坏死因子。我忘记了 Convert 适用于对象,而不是仅适用于字符串。
【解决方案2】:

Convert.ToDouble 方法将指定值转换为双精度浮点数。

public static double Foo(object obj)
    {
        return Convert.ToDouble(obj);
    }

【讨论】:

    【解决方案3】:

    这是使用Double.TryParse()的快捷方式:

    public static double Foo(object obj)
    {
       double result;
       if (double.TryParse(obj.ToString(), out result))
          return result;
       else throw new ArgumentException("Argument should be a number", "obj");
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-05
      • 2011-02-25
      相关资源
      最近更新 更多