【问题标题】:C# int- or object-to-double casting error explanationC# int- 或 object-to-double 转换错误解释
【发布时间】:2012-05-10 08:38:22
【问题描述】:

以下代码在最后一次赋值时失败:

static void Main(string[] args)
{
    int a = 5;
    object b = 5;

    System.Diagnostics.Debug.Assert( a is int && b is int );

    double x = (double)a;
    double y = (double)b;
}

如果a和b都是int,那么这个错误的原因是什么?

【问题讨论】:

标签: c# casting int double


【解决方案1】:

拆箱需要确切的类型 - 您可以这样做:

double y = (double)(int)b;

【讨论】:

    【解决方案2】:

    这是一个非常常见的问题。请参阅http://blogs.msdn.com/b/ericlippert/archive/2009/03/19/representation-and-identity.aspx 了解说明。


    片段:

    我收到了很多关于 C# cast 运算符的问题。我得到的最常见的问题是:

    short sss = 123;
    object ooo = sss;            // Box the short.
    int iii = (int) sss;         // Perfectly legal.
    int jjj = (int) (short) ooo; // Perfectly legal
    int kkk = (int) ooo;         // Invalid cast exception?! Why?
    

    为什么?因为装箱的T 只能拆箱到T。 (*) 拆箱后,它只是一个可以照常转换的值,所以双重转换就可以了。

    (*) 或Nullable<T>

    【讨论】:

      【解决方案3】:

      aint,但 b 是对 int 对象的引用 - 这就是所谓的装箱 int。它们是两个不同的东西,因此有不同的行为。

      【讨论】:

        【解决方案4】:

        隐式转换是一种编译时操作。 object 类型的 b 是不可能的。

        【讨论】:

          【解决方案5】:

          这是 System.Convert 派上用场的罕见情况之一。如果您事先不知道它将是 int,则可以使用 System.Convet.ToDouble(obj) 将其淘汰。

          【讨论】:

          • 我建议将此作为解决方案,因为直接强制转换可能会导致精度损失。
          猜你喜欢
          • 2020-08-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-06-27
          • 1970-01-01
          • 2015-10-07
          • 2012-06-25
          • 2015-07-04
          相关资源
          最近更新 更多