В чем разница между конвертированием и распаковкой? - PullRequest
6 голосов
/ 09 июня 2009

В выражениях LINQ DLR, в чем разница между:

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

и это:

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

Документация по этому вопросу кажется немного отрывочной.

И более того, какой из них эквивалентен этому коду C #:

(ClassA)InstanceOfClassB

Где ClassB имеет неявный или явный оператор для приведения к ClassA?

Ответы [ 4 ]

4 голосов
/ 10 июня 2009

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

3 голосов
/ 09 июня 2009

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

См. Expression.Convert:

Если выражение или тип. пользовательский тип, который определяет неявное или явное преобразование оператор, MethodInfo, который представляет, что оператор является реализующий метод.

, а также:

Если выражение или тип является ссылочный тип и явный бокс, распаковка или конверсия ссылок существует из выражения. Тип для ввода, способ реализации нуль.

2 голосов
/ 09 июня 2009

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

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

1 голос
/ 09 июня 2009

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

...