2015-04-27 2 views
1

Я новичок в 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.

ответ

7

Потому что это unboxing conversion. Для того, чтобы бросить коробочную long к double, вы можете сначала распаковать его, то на самом деле преобразовать его, например: (не тестировалось)

object obj = 123L; 
double dbl = (double)(long)obj; 

Второй фрагмент кода работает по той причине, вы идентифицированной.

+0

Я вижу, поэтому использование «объекта» в качестве типа переменной создает ссылку на значение. Есть ли способ сбросить значение в double, если он является двойным и длинным, если он длинный? –

+0

@Jacque Как планировать сохранение произвольного недопущенного значения? В 'var'? Помните, что 'var' разрешается во время компиляции. Если бы было такое выражение для того, чтобы распаковать объект на свой собственный тип, каков был бы тип такого выражения? Это не может быть объектом, так как вы закончите тем, с чего начали. Если вы хотите получить доступ к данным внутри экземпляра, вы можете - ** НЕ РЕКОМЕНДУЕТСЯ ** - использовать 'TypedReference'. Если вы хотите передать этот объект перегрузкам методов, которые принимают как 'double', так и' long', используйте его как 'dynamic'. – IllidanS4

+0

@JacqueGoupil да, но не очень полезен, насколько я знаю. Может, вам нужны дженерики и избавиться от бокса? – harold

2

Когда вы бросаете объект в тип значения, вы получаете unbox it. Unboxing возможно только для типа значения. Поскольку тип объекта длинный, вы не можете распаковать его, чтобы удвоить. Проверьте класс Convert:

double dbl = Convert.ToDouble(obj, null); 
Смежные вопросы