c# - .NET 双重除法无效强制转换异常

标签 c# .net

我正在开发一个 .NET 应用程序以使用 ImageMagick 减小图像文件大小.我的应用程序将一些“设置”存储在 Hashtable 中,以供应用程序的各个区域使用。我现在正在添加一项功能以根据需要减小图像大小 DPI在转换后的图像中。基本上,我在未更改的图像中查找 DPI,计算所需 DPI 相对于当前 DPI 的百分比,然后我将按此比例调整图像尺寸。

ImageMagick 将图像 DPI 报告为浮点值。所以 200x200 DPI 实际上是 199.975x199.975。因此,我使用 Math.Ceiling() 将值获取到我的应用程序中。当我尝试使用我的设置 Hashtable 中的所需 DPI 进行百分比计算时,我得到了一个无效的转换异常。我不知道为什么会这样。

这是一个测试用例,它以与我的实际代码相同的方式失败:


using System;
using System.Collections;

namespace typetest
{
    class Program
    {
        private struct DPI {
            public double x;
            public double y;
        }

        public static void Main(string[] args)
        {
            Hashtable vars = new Hashtable();
            DPI dpi;
            string dpiString = "199.547:199.547";
            string[] ret;

            vars["newDpiX"] = 150;
            vars["newDpiY"] = 150;
            ret = dpiString.Split(':');

            dpi.x = ( (double)vars["newDpiX"] / Math.Ceiling(double.Parse(ret[0])) ) * 100;
            dpi.y = ( (double)vars["newDpiY"] / Math.Ceiling(double.Parse(ret[1])) ) * 100;

            Console.WriteLine("New DPI percentage = " + dpi.x + "%x" + dpi.y +"%");
        }
    }
}

如果我把分部改成


double newDpiX = 150.0;
dpi.x = ( newDpiX / Math.Ceiling(double.Parse(ret[0])) ) * 100;

它将按预期工作。这是怎么回事?

最佳答案

哈希表存储对象。当您将一个 int 放入一个对象中时,您将其“装箱”。拆箱需要相同的类型,不能直接从装箱的 int 转换为 double。

这会失败:

object obj = 10;
double dbl = (double)obj;

这会成功:

object obj = 10d; // a double value, could also have been 10.0
double dbl = (double)obj;

这也行:

object obj = 10; // an int
double dbl = (double)(int)obj;

首先拆箱为 int,然后才转换为 double。

编辑:

另见 http://blogs.msdn.com/ericlippert/archive/2009/03/19/representation-and-identity.aspx

关于c# - .NET 双重除法无效强制转换异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1644561/

相关文章:

.net - 如何将 WPF 工具包图表的项目源动态数据绑定(bind)到公共(public)属性?

.net - 温莎城堡 : suppress exceptions thrown by Resolve()

c# - HTML Agility Pack 选择节点

c# - 如何检查SQL数据库中是否有记录?

c# - 如何序列化 CustomLineCap 类的实例

c# - 为什么 List<T>.Enumerator 比我的实现更快?

.net - 在 VC++ 中编程以在 Windows 之外运行

c# - Python 日期时间格式,如 C# String.Format

C#/DDD : How to model entities with internal state objects not instantiable by the domain layer when using onion architecture?

c# - 如何以编程方式从当前项目构建和编译另一个 c# 项目