正如其他人在 cmets 中所说,您要转换的值并不是真正的 float - 但这可能会令人困惑,因为 它可能看起来像 float - 这里是一个可能场景的例子:
object maybeFloat = 1.25; // looks like a float, but is actually a double!
float wontWork = (float)maybeFloat;
上面的转换会失败,抛出一个InvalidCastException——因为实际存储的项目(在C#中技术上称为boxed,在structs的情况下,例如int, float、double 以及自定义 struct 类型)是 double,而不是 float。有几个“修复”:
object someFloat = 1.25f; // Notice the `f` after the number - that's a float!
float willWork = (float)someFloat;
...但这并不总是可能的 - 数据可能来自某些外部来源,例如数据库等。在这种情况下,float.Parse 来救援:
object maybeFloat = 1.25; // Still not a float... but can be parsed as one!
float willWork = float.Parse(maybeFloat.ToString()); // float.Parse requires a string,
// hence the `.ToString()` call
如果对象包含一个实际上可解析为float 数据类型的值,这将起作用。因此,上面的示例适用于将装箱的double 解析为float(请注意,可能会发生一些数据丢失 - 不是在上面的示例中,但一般来说,因为float 是比double 更小的数据类型)。如果存储的值是string,这也将起作用(顺便说一句,strings 没有装箱,因为它们是引用类型)。也许奇怪的是,.ToString() 调用仍然是必需的——因为没有从object 到string 的隐式转换:
object maybeFloat = "1.25"; // Still not a float... but can be parsed as one!
float willWork = float.Parse(maybeFloat.ToString()); // no implicit conversion,
// hence the `.ToString()` call
...但是如果存储的值真的,真的,根本不是浮点数怎么办?好吧,那么float.Parse 将失败,很可能会抛出FormatException,表明提供的值确实无法解析为float 数据类型。您可以使用 try/catch 块捕获异常:
object maybeFloat = "one point two five"; // hmmm... that won't parse into a float!
float result = default;
try
{
result = float.Parse(maybeFloat.ToString());
}
catch (FormatException _)
{
// Handle error here!
}
...不过,还有更好的方法 - float.TryParse:
object maybeFloat = "one point two five"; // will fail to parse!
bool isSuccessfullyParsed = float.TryParse(maybeFloat.ToString(), out var result);
if (!isSuccessfullyParsed)
{
// Handle error
}
else
{
// `result` will contain the properly parsed float value
}
好的,这应该可以让您很好地了解您的具体情况。最后一点,.Parse 和 .TryParse 方法存在于所有 .NET 数字类型上 - int、long、float、double、decimal,甚至是 BigInteger - 所以同样的技术适用于全部。