try todas predefinidas practicas por personalizadas net manejo las framework excepciones ejemplo catch buenas c# generics dynamic c#-7.0

c# - todas - ¿Por qué llamar a una función local genérica con un parámetro dinámico produce una excepción BadImageFormatException?



try catch c# ejemplo (1)

Jugando con las funciones locales de C # 7, terminé con un comportamiento interesante. Considere el siguiente programa:

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");

Esto produce:

Entrado Principal

... y luego lanza una BadImageFormatException: An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B) BadImageFormatException: An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B) . Traza de pila

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()

(Estoy ejecutando esto en LINQPad, pero obtengo resultados similares de dotnetfiddle).

Al eliminar la línea indicada en el código se obtiene el resultado esperado:

Entrado Principal
Entró en algo
Genérico
GenericLocal

¿Alguien puede explicar por qué?


Cuando ayudas al compilador un poco, el código no se romperá:

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