Почему вызов общей локальной функции с динамическим параметром вызывает исключение BadImageFormatException?

Играя с С# 7 Local Functions, у меня появилось какое-то интересное поведение. Рассмотрим следующую программу:

public void Main()
{
    Console.WriteLine("Entered Main");
    DoSomething("");
}

private void DoSomething(object obj)
{
    Console.WriteLine("Entered DoSomething");
    Generic((dynamic)obj);
    GenericLocal(obj);
    GenericLocal((dynamic)obj); // This breaks the program

    void GenericLocal<T>(T val) => Console.WriteLine("GenericLocal");
}

private void Generic<T>(T val) => Console.WriteLine("Generic");

Это дает:

Введено Главная

... и затем выбрасывает a BadImageFormatException: An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B). Трассировка стека:

   at UserQuery.DoSomething(Object obj)
   at UserQuery.Main()
   at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ThreadHelper.ThreadStart()

(Я запускаю это в LINQPad, но получаю аналогичные результаты от dotnetfiddle.)

Удаление указанной строки в коде дает ожидаемый результат:

Вход Главная | Вход в DoSomething
Generic
GenericLocal

Может кто-нибудь объяснить, почему?

Ответы

Ответ 1

Когда вы немного поможете компилятору, код не сломается:

GenericLocal<dynamic>((dynamic)obj); // This doesn't break the program