Это вызвано тем, что анонимные типы создаются компилятором как internal
.Это означает, что код вне вашей сборки не сможет получить доступ к типам.Когда вы делаете отражение самостоятельно, все вызовы поступают из вашей сборки, поэтому это разрешено.Но когда вы вводите выражения, вызовы начинают поступать из библиотек DLL и поэтому они останавливаются.
Простой способ решения проблем такого рода - с атрибутом InternalsVisibleTo .Просто добавив это:
[assembly: InternalsVisibleTo("System.Core")]
, вы сможете создать лямбду.Однако, когда вы идете, чтобы скомпилировать его, вы получаете аналогичное разрешение разрешения.В этом случае метод Compile запускает некоторый код в mscorlib.dll, чтобы попытаться получить доступ к вашему типу.Я попытался добавить:
[assembly: InternalsVisibleTo("mscorlib")]
, но это не сработало.Я думаю, что это может быть связано с тем фактом, что mscorlib строго подписан.В соответствии с документацией InternalsVisislbeTo:
Как текущая сборка, так и сборка друга должны быть без знака, либо обе должны быть подписаны строгим именем.
Возможно, если вашкод был подписан, это будет работать.Или, возможно, вам даже не нужен вызов Compile () - может, это было только для тестирования?Добавление ссылки на System.Core стоит попробовать.