Это очень старый вопрос, но я хотел бы добавить еще один прецедент: когда у вас есть структура и вы хотите установить ее переменную через отражение, вы всегда будете работать с бокс-значением и никогда измените оригинал. Это бесполезно:
TestFields fields = new TestFields { MaxValue = 1234 };
FieldInfo info = typeof(TestFields).GetField("MaxValue");
info.SetValue(fields, 4096);
// result: fields.MaxValue is still 1234!!
Это может быть исправлено с подразумеваемым боксом, но тогда вы потеряете безопасность типа. Вместо этого вы можете исправить это с помощью TypedParameter
:
TestFields fields = new TestFields { MaxValue = 1234 };
FieldInfo info = fields.GetType().GetField("MaxValue");
TypedReference reference = __makeref(fields);
info.SetValueDirect(reference, 4096);
// result: fields.MaxValue is now indeed 4096!!
Почему это неконструктивно? : o – nawfal
Также см. http://stackoverflow.com/questions/4764573/why-is-typedreference-behind-the-scenes-its-so-fast-and-safe-almost-magical – nawfal
Вы также можете использовать его для передачи расположение стека/ссылку на переменные «вокруг» (например, к другому потоку или вернуть его из метода). Для этого требуется небезопасный код и «копирование» TypedReference в виде двух IntPtr. –