我正在开发一个 .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/