c# compiler-construction crash

Fallo del compilador C#4.0



compiler-construction crash (4)

Este ejemplo de código no se puede compilar. ¿Algún trabajo por ahí?

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { using church = Func<dynamic, dynamic, dynamic>; class Program { static void Main(string[] args) { church True = (a, b) => a; church False = (a, b) => b; Func<church, church, church> And = (x, y) => x(y(True, False), False); } } }

Error 6 Error interno del compilador (0xc0000005 en la dirección 5476A4CC): el culpable probable es "EMITIL". Se ha producido un error interno en el compilador. Para solucionar este problema, intente simplificar o cambiar el programa cerca de las ubicaciones enumeradas a continuación. Las ubicaciones en la parte superior de la lista están más cerca del punto en el que ocurrió el error interno. Errores como este pueden ser reportados a Microsoft usando la opción / errorreport. Prueba de Aplicación


Aquí hay otra solución: no use Func , use un buen tipo de delegado antiguo.

public delegate dynamic Church(dynamic x, dynamic y); class Program { static void Main(string[] args) { Church True = (a, b) => a; Church False = (a, b) => b; Func<Church, Church, Church> And = (x, y) => x(y(True, False), False); } }

Esto también tiene el beneficio de que Church se define en todas partes, y no solo como un archivo que usa un alias.


Claramente eso es un error del compilador.

Le mencioné esto a uno de nuestros evaluadores y él dice:

Me complace informar que esto ya se ha solucionado y verá esta solución en la próxima versión de VS. En realidad, ¡también lo verás arreglado en BUILD Developer Preview para Visual Studio!

Disculpas por el error, y gracias por traer esto a nuestra atención.


EDITAR: Ahora he logrado reproducirlo, y tengo una solución potencial.

Esto funciona:

csc Test.cs

Esto no hace

csc /debug+ Test.cs

Así que parece que es un problema con la información de depuración. Si puedes vivir sin eso en tu situación particular, estás listo para ir ...

EDIT: Acabo de probar, y esto sucede con /debug:pdbonly también ...

EDITAR: En caso de que alguien se esté preguntando, le haré una pregunta a Eric Lippert sobre esto.

EDIT: Este es ahora el repro mínimo que he encontrado:

using church = System.Func<dynamic>; class Program { static void Main() {} }


Reprodifiqué el fallo utilizando VS2010 (WinXP 64).

Dos soluciones:

1. no use el alias de using

El siguiente código compila limpiamente en VS2010:

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { Func<dynamic, dynamic, dynamic> True = (a, b) => a; Func<dynamic, dynamic, dynamic> False = (a, b) => b; Func<Func<dynamic, dynamic, dynamic>, Func<dynamic, dynamic, dynamic>, Func<dynamic, dynamic, dynamic> > And = (x, y) => x(y(True, False), False); } } }

2. usar el compilador mono

No hay problema con el compilador Mono 2.10 (dmcs).

[mono] /tmp @ dmcs test.cs test.cs(18,42): warning CS0219: The variable `And'' is assigned but its value is never used Compilation succeeded - 1 warning(s) [mono] /tmp @ ./test.exe [mono] /tmp @

Esto fue probado en Linux.

  1. Puede ejecutar binarios creados con mono en Windows .NET.
  2. El compilador mono viene con un instalador MSI y también se ejecuta en Windows.