Помогите перевести деконструкцию Reflector в скомпилированный код - PullRequest
2 голосов
/ 16 мая 2010

Итак, я отражаю некоторый код фреймворка 2.0 и в итоге получаю следующую деконструкцию

fixed (void* voidRef3 = ((void*) &_someMember))
{
...
}

Это не скомпилируется из-за 'The right hand side of a fixed statement assignment may not be a cast expression'

Я понимаю, что Reflector может только приблизиться и обычно я вижу четкий путь, но это немного за пределами моего опыта.

Вопрос: что мне пытается описать Reflector?

Обновление:

также вижу следующее

fixed (IntPtr* ptrRef3 = ((IntPtr*) &this._someMember))

Обновление:

Итак, как говорит Митч, это не побитовый оператор, а оператор addressOf.

Вопрос сейчас:

fixed (IntPtr* ptrRef3 = &_someMember)

завершается с ошибкой компиляции 'Cannot implicitly convert type 'xxx*' to 'System.IntPtr*'. An explicit conversion exists (are you missing a cast?)'.

Так что я, кажется, был проклят, если я это сделаю, и проклял, если я этого не сделаю. Есть идеи?

UPDATE:

Я думаю, что понял. Случайно я вернулся к выражению, которое использовало void*, и удалил приведение, и VS прекратил жаловаться, и, поскольку я понял, что участники этого разговора void* и intptr* эквивалентны, я просто поменял их местами, в результате это:

fixed (void* ptrRef3 = &_someMember)

и В.С. перестал жаловаться. Может ли кто-нибудь проверить, что

fixed (void* ptrRef3 = &_someMember)

эквивалентно

fixed (IntPtr* ptrRef3 = &_someMember)

Ответы [ 2 ]

2 голосов
/ 16 мая 2010

Он берет адрес _someMember и преобразует его в (void *) (т.е. адрес указателя), а затем устанавливает местоположение по этому адресу.

Оператор fixed 'закрепляет' объект и не позволяет ГХ перемещать его.

'&', используемый в этом контексте, является оператором 'Address Of', а не побитовым And.

В ответ на обновленный вопрос:

Вы пробовали:

fixed (void* voidRef3 = &_someMember) 
{ 
... 
}
0 голосов
/ 16 мая 2010

Отвечая на ваш последний комментарий: это работает для вас?

fixed (IntPtr* ptrRef3 = (IntPtr *) &_someMember)

Редактировать

Я не уверен, что вы имеете в виду

то есть какой отражатель дал мне

Ошибка, о которой вы упомянули, кажется совершенно ясной: она может явно преобразоваться из (void *) в (IntPtr *), если вы спросите. Мой пример спрашивает, ваш нет.

Действительно ли вы получаете то же сообщение об ошибке при вставке (IntPtr *)?

Другое Править

Может ли кто-нибудь проверить, что

fixed (void* ptrRef3 = &_someMember)

эквивалентно

fixed (IntPtr* ptrRef3 = &_someMember)

Прежде всего: да, они эквивалентны.

Во-вторых: я думал о том, что все это значит. Я думаю, что декомпилятор считает, что он не знает достаточно, чтобы создать подвижную ссылку на _someMember, и поэтому не может оставить это для среды выполнения C # для управления им. Чтобы справиться с этим, он использует fixed, чтобы отключить сборку мусора для этой памяти, оставляя вам возможность сообщать среде выполнения, когда безопасно освобождать.

Поэтому это не тот код, который вы должны хранить: как только вы выясните реальное значение и срок службы этого бита данных, перепишите его, чтобы использовать обычные (собираемые мусором) переменные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...