【发布时间】:2013-07-05 05:01:46
【问题描述】:
这是我遇到的一个奇怪的问题。我有一个返回object 的函数。在特定情况下,我确定该对象是int,但另一个调用此函数的函数需要float。我可以让它工作的唯一方法是:
private object parser(string expr) {...}
private float parseFloat(string expr)
{
...
object result = parser(expr);
if (result is int)
return (float)(int)result;
else
return (float)result;
}
没有那种类型检查,我根本无法让它工作,即使我知道在这种情况下解析器函数的结果是int。 (你可以在调试器中看到它。)我更喜欢这条线:
private float parseFloat(string expr)
{
...
return (float)parser(expr);
}
(类型检查是事先完成的,并且永远不应该使用不会评估为float 或int 的表达式调用parseFloat。)有什么理由需要双重转换这个变量吗?我显然不想在所有情况下都重复它,因为如果来自parser 是 float 的返回,它会先将它截断为int 而我们不会想要那个。 (是的,我尝试将float 和int 替换为Single 和Int32 等。没有任何区别。)
我看到了this question,但这取决于提前知道类型,它提供的唯一解决方案是这种双重转换技巧,在我的情况下,除非我先进行类型检查,否则它会截断floats ,这也需要一个额外的局部变量来保存结果。有什么办法可以避免这个额外的步骤?
【问题讨论】:
-
如果您确定它是一个,为什么不提供
ParseFloat? -
这就是 ... 的用途。传递给
ParseFloat的表达式要么是浮点字面量(在 ... 代码中处理),要么是返回浮点数的函数。parser的工作就是解释这些函数(实际上可能是几个嵌套函数)。 -
这是一个常见问题。我在 2009 年回答了这个问题,在这里:ericlippert.com/2009/03/03/representation-and-identity
-
@EricLippert 不错的文章,解释得很好。并没有让它变得不那么烦人,但至少有一个很好的理由说明它不能按您期望的方式工作。