Что возможно в IL чего нельзя сделать на языке высокого уровня .NET?

1,00
р.
В общем, задался этим вопрос из-за этого ответа по другому вопросу.
В нем утверждается, что в IL коде можно получать доступ к приватным полям другого класса забивая на инкапсуляцию, естественным путем не прибегая к дорогостоящей рефлексии.
(Так ли это?)
Получается, что я могу взять IL-код, полученный после компиляции на C# и добавить в него какое-нибудь экзотическое поведение(Которое не запрещено в IL), которого нельзя добиться языком высокого уровня, скомпилировать и подключить эту сборку к проекту и прозрачно использовать на каком-нибудь C# ?
Собственно, интересует вопрос, на сколько все дозволено в IL и возможные побочные эффекты у пользователей таких либ.

Ответ
Возможности IL несколько шире возможностей C#, например можно распаковывать объекты по ссылке:
ldarg_0 unbox [mscorlib]System.Int32 ldc.i4 42 stobj [mscorlib]System.Int32 ret
Вот к чему такое приводит:
object obj = -1 Foo(obj) Console.WriteLine(obj) // 42
Однако, большинство ограничений C# и IL - общие: язык C#, особенно в последних версиях, позволяет очень многое из того что позволяется средой выполнения. И да, просто так обращаться к приватным полям в IL - нельзя.

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