Я новичок в C# (но я знаю C++, JavaScript и Java), и я использую JSON.net для разбора файла JSON на Dictionary<string, object>
. Теперь я пытаюсь сохранить значение, которое было проанализировано как long
в двойную переменную. (Я посмотрел на инспектора и он говорит, что значение словаря имеет тип object{long}
.)Почему я не могу наложить объект-var длиной до double?
object obj = 123L;
double dbl = (double)obj;
Который дает мне InvalidCastException
. Я немного экспериментировал и узнал, что Convert.ToDouble(obj)
работает отлично. Я огляделся и не мог найти ничего об этой разнице между кастингом и конвертированием. Также:
var v = 123L;
double dbl = (double)v;
Это прекрасно работает. Я думаю, это потому, что в этом случае var во время компиляции превращается в Int64.
Я вижу, поэтому использование «объекта» в качестве типа переменной создает ссылку на значение. Есть ли способ сбросить значение в double, если он является двойным и длинным, если он длинный? –
@Jacque Как планировать сохранение произвольного недопущенного значения? В 'var'? Помните, что 'var' разрешается во время компиляции. Если бы было такое выражение для того, чтобы распаковать объект на свой собственный тип, каков был бы тип такого выражения? Это не может быть объектом, так как вы закончите тем, с чего начали. Если вы хотите получить доступ к данным внутри экземпляра, вы можете - ** НЕ РЕКОМЕНДУЕТСЯ ** - использовать 'TypedReference'. Если вы хотите передать этот объект перегрузкам методов, которые принимают как 'double', так и' long', используйте его как 'dynamic'. – IllidanS4
@JacqueGoupil да, но не очень полезен, насколько я знаю. Может, вам нужны дженерики и избавиться от бокса? – harold