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.
- Puede ejecutar binarios creados con mono en Windows .NET.
- El compilador mono viene con un instalador MSI y también se ejecuta en Windows.