Вот и я столкнулся со странным. У меня есть функция, которая возвращает 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);
}
(Проверка типов выполняется заранее, и parseFloat
никогда не следует вызывать с выражением, которое не будет оцениваться как float
или int
.) Есть ли какая-то причина, по которой необходимо дважды приводить эту переменную? Я, очевидно, не хочу использовать двойное приведение во всех случаях, потому что если бы возврат из parser
был float
, он сначала усек бы его до int
, а мы этого не хотим. (И да, я пытался заменить float
и int
на Single
и Int32
и т. д. Никакой разницы.)
Я видел этот вопрос, но это зависит от предварительного знания типа , и единственное решение, которое он предлагает, - это трюк с двойным приведением типов, который в моем случае усекает float
s, если я сначала не проверю тип, что также требует дополнительной локальной переменной для хранения результата. Есть ли способ избежать этого дополнительного шага?
ParseFloat
, если вы точно знаете, что это один? - person Tim Schmelter   schedule 08.07.2013ParseFloat
, является либо литералом с плавающей запятой (который обрабатывается в коде ...), либо функцией, которая возвращает число с плавающей запятой. Работаparser
состоит в том, чтобы интерпретировать такие функции (которые на самом деле могут быть несколькими вложенными функциями). - person Darrel Hoffman   schedule 08.07.2013