50 votes

C# 4.0 Compilateur Crash

Cet exemple de code ne peut pas être compilé. Toutes les solutions?

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

Erreur 6 Erreur Interne du Compilateur (0xc0000005 à l'adresse 5476A4CC): probable est 'EMITIL'. Une erreur interne s'est produite dans le compilateur. Pour contourner ce problème, essayez de simplifier ou modifier le programme, près de l'une des adresses indiquées ci-dessous. Emplacements en haut de la liste sont plus près du point où l'erreur interne s'est produite. Les erreurs de ce type peuvent être signalés à Microsoft par l'aide de la /errorreport option. TestApplication

49voto

Eric Lippert Points 300275

Clairement que c'est un bug du compilateur.

J'en ai parlé à l'un de nos testeurs et il dit:

Je suis heureux de signaler que cela a déjà été corrigé et vous verrez ce correctif dans la prochaine version de VS. Vous verrez qu'il fixe dans la version Developer Preview de Visual Studio!

Toutes mes excuses pour l'erreur, et merci pour avoir porté à notre attention.

27voto

sehe Points 123151

J'ai reproduit la panne à l'aide de VS2010 (WinXP 64).

Deux solutions:

1. n'utilisez pas l' using alias

Le code suivant compile correctement sur 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. utiliser le compilateur Mono

Pas de problème avec Mono 2.10 compilateur (ecq).

[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 @ 

Cela a été testé sur linux.

  1. Vous pouvez exécuter des binaires créés avec mono sous Windows .NET.
  2. Mono compilateur est livré avec un programme d'installation MSI et fonctionne sur Windows.

21voto

Jon Skeet Points 692016

EDIT: j'ai maintenant réussi à le reproduire, et j'ai un potentiel de solution de contournement.

Ceci fonctionne:

csc Test.cs

Ce n'est pas le cas:

csc /debug+ Test.cs

Donc, on dirait que c'est un problème avec les informations de débogage. Si vous pouvez vivre sans que, dans votre scénario, vous êtes bon pour aller...

EDIT: je viens de le tester, et ce qui se passe avec /debug:pdbonly ...

EDIT: Juste au cas où quelqu'un a été vous demandez-vous, je vais ping Eric Lippert à ce sujet.

EDIT: C'est maintenant le minimum de repro que j'ai trouvé:

using church = System.Func<dynamic>;

class Program
{
    static void Main() {}
}

14voto

configurator Points 15594

Voici une autre solution: ne pas utiliser Func, utiliser un bon vieux type de délégué.

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

Cela a aussi l'avantage, que l'Église est définie partout, et pas seulement en tant que fichier par fichier à l'aide de l'alias.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X