2010-05-16 4 views
2

Поэтому я Отражатель-ки некоторый код фреймворки 2.0 и в конечном итоге со следующей деконструкциейПомощи перевода Отражатель деконструкция в компилируемый код

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

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

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

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

Update:

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

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

Update:

Так что, как говорит Митч, он не является оператор побитового, а оператор 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

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

Оператор fixed «выдает» объект и предотвращает его перемещение.

Используемый в этом контексте «&» - это оператор «Адрес», а не бит. И.

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

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

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

Mitch, меня больше интересует то, что кажется мне поразным оператором '&', который украшает _someMember. По-видимому, это синтаксис, с которым я не знаком. И, похоже, это сравнение, а не сравнение. Опять же, может быть, я что-то упустил. –

+1

Это не побитовый оператор, когда он используется таким образом; это оператор «адреса» (тот же, что и в C и C++) –

+0

Я подозревал, что так много. Поэтому позвольте мне подправить вопрос. Спасибо и извините за движущуюся цель. –

0

В ответ на ваш последний комментарий: делает эту работу за вас?

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

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

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

, что эффективно, что отражатель дал мне

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

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

Другой Редактировать

Может кто-то проверить, что

fixed (void* ptrRef3 = &_someMember)

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

fixed (IntPtr* ptrRef3 = &_someMember)

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

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

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

+0

спасибо за ответ, но это то, что дал мне рефлектор, и он дает ошибку компиляции, которую я перечислял. Если пробелы между 'IntPtr' и' * 'значительны? Поэтому, видимо, я не знаю, как выразить актерский путь таким образом, чтобы компилятор нашел удовольствие. Я думаю, что в этом есть руб. –

+0

Reflector (http://www.red-gate.com/products/reflector/) - инструмент декомпиляции .net, который генерирует код из IL. Как правило, он выводит компилируемый код, но есть краевые случаи, в которых у него нет умнов, чтобы построить правильный C# из IL. И в этих случаях я обычно могу сделать вывод о намерении. Кажется, это то, что, очевидно, я не понимаю, как правильно выразить себя на C#. И да, пример, который вы даете, фактически совпадает со вторым фрагментом в моем вопросе, который дает ту же ошибку компиляции. –

+0

Это задание, что это «намерение» выражается в C#, поскольку исходным источником является C#, но инструмент декомпиляции в этом случае не помог мне. Я не являюсь C# гуру, но я, как и вы, толкал биты в течение нескольких десятилетий, и это раздражает меня, когда я нахожусь в тупике от sytax. ;-) –