6

В DLR в LINQ выражения, в чем разница между этим:В чем разница между преобразованием и распаковкой?

Expression.Convert(SomeVariableExpression, typeof(T)); 

и это:

Expression.Unbox(SomeVariableExpression, typeof(T)); 

документация на это кажется немного поверхностна.

И еще до точки, что один из них равносильна этому C# код:

(ClassA)InstanceOfClassB 

Где ClassB имеет неявный или явный оператор, чтобы бросить в ClassA?

+1

Извините, это получило двойной отправленный. Я удалил другой, хотя. :-) –

+0

См. [Этот вопрос] (http://stackoverflow.com/q/32158399/1127114) для конкретного примера, когда необходимо использовать Unbox вместо Convert. –

ответ

3

Ну, главное отличие состоит в том, что Epression.Unbox необходим только для явного распаковки типа значения из кучи. Expression.Convert - это метод, который вы хотели бы использовать для привязки к пользовательскому преобразованию (неявное или явное).

См Expression.Convert:

Если какая-либо expression.Type или тип определенный пользователем тип, который определяет неявный или явный оператор преобразования , то MethodInfo, что представляет, что оператор является метод реализации ,

, а также:

Если какой-либо expression.Type или типа является типа ссылки и явный бокс, распаковки или ссылочное преобразованием существует с expression.Type к типу, исполнительного способ null.

1

Expression.Convert - эквивалент выполнения приведения.

+0

Unboxing - это процесс получения типа значения, который ранее был помещен в бокс (другими словами, значение из стека копируется в кучу, а ссылка на новый объект помещается в стек). –

2

В общем, бокс принимает тип значения и обертывает его в объект. Unboxing делает обратное. Вы можете думать об этом, поскольку бокс принимает значение регистра или стека и помещает его в кучу, возвращая указатель на это значение. Unboxing берет объект в кучу и помещает его в регистр или стек. Базовый тип данных остается прежним.

Преобразование изменяет один тип данных в другой.

4

Важная вещь Unbox заключается в том, что он дает вам адрес в штучной упаковке. Это гарантирует, что вы можете вызвать метод для значения unboxed. Если этот метод изменяет тип значения, он изменяет версию в штучной упаковке вместо новой копии. Если вы просто сделали Convert, вы действительно сделали бы копию типа значения в виде бокса, а затем вызов метода на нем изменил бы копию, а не исходное значение.

 Смежные вопросы

  • Нет связанных вопросов^_^