在项目中创建JSON设置文件时遇到了一件非常奇怪的事情。 globalSettings是一个存储许多设置的容器。
在属性PreHeight中,我将新值存储到globalSetting(这些设置将在应用程序退出时持久保存到json文件中)。为了清楚起见,我什至明确地使用了“值”(并非真正需要)。
globalSettings["PreHeight"] = (float)value;
当我尝试在启动时重新加载设置时,我首先尝试了以下代码。
PreHeight = (float)globalSettings["PreHeight"];
令我惊讶的是,它引发了无法强制转换的异常。然后,我只是将行更改为使用语言中立方法Convert.ToSingle()。在后台,它应该执行完全相同的类型转换。令我惊讶的是,使用Convert.ToSingle()方法时,代码行没有抛出。
PreHeight = Convert.ToSingle(globalSettings["PreHeight"]);
有人可以解释这种奇怪的行为吗?
我很清楚JSON以最简单的数据类型保存,因此0被视为整数,但是到底为什么将其强制转换为浮点数呢?
答案 0 :(得分:0)
开凿脑袋后,我得出一个结论,即您的框架仅返回一个对象(而不是字符串或浮点数)。
因为它不是字符串,所以请浮动。解析失败。
由于它是一个对象,并且CLR假定它是Double Precision浮点数(默认),因此Typecast运算符由于可能会损失精度而无法对其进行转换。这就是类型转换运算符无法工作的方式。替代代码可能是
PreHeight = (float) ((double)(globalSettings["PreHeight"]);
Convert.ToSingle是负责将Double Precision转换为Single Precision的人,并且效果很好。
PreHeight = Convert.ToSingle(globalSettings["PreHeight"]);
是处理此转换的唯一权利。
答案 1 :(得分:0)
如果通过索引globalSettings
返回的值是一个字符串,则无法将string
强制转换为float
。 Convert.ToSingle
在内部使用Single.Parse
。这就是它起作用的原因,也是您应该使用的:
using System;
PreHeight = Single.Parse(globalSettings["PreHeight"]);
// or
PreHeight = float.Parse(globalSettings["PreHeight"]);