Bogue du compilateur C #? La syntaxe d’initialisation d’object utilisée pour la propriété en écriture seule dans Expression provoque l’arrêt de csc

Vous pouvez considérer ceci comme un rapport de bogue, mais je suis curieux de savoir si je me trompe terriblement ici ou s’il existe une explication d’Eric ou de quelqu’un d’autre chez Microsoft.

Mettre à jour

Ceci est maintenant signalé comme un bogue sur Microsoft Connect.

La description

Considérez la classe suivante:

class A { public object B { set { } } } 

Ici, AB est une propriété en écriture seule mais fine.
Maintenant, imaginons que nous l’ assignions à l’intérieur de l’expression :

 Expression<Func> expr = () => new A { B = new object { } }; 

Ce code fait cracher le compilateur C # (à la fois 3.5.30729.4926 et 4.0 .30319.1)

Erreur interne du compilateur (0xc0000005 à l’adresse 013E213F): le coupable probable est ‘BIND’.

et crash.

Cependant, le simple remplacement de la syntaxe d’initialisation d’object ( { } ) par un constructeur ( ( ) ) comstack parfaitement .

Code complet pour la reproduction:

 using System; using System.Linq.Expressions; class Test { public static void Main() { Expression<Func> expr = () => new A { B = new object { } }; } } class A { public object B { set { } } } 

(Et oui, j’ai travaillé dessus sur un vrai projet.)

J’ai bien peur de ne pas être Eric Lippert (Oh, mais pourrais-je être aussi fringant …), mais en tant qu’ancien mec de Visual Studio qui peut toujours rechercher les sources, je peux dire deux choses à ce sujet:

  1. Chaque fois que vous voyez quelque chose qui commence par “Erreur interne du compilateur”, vous avez très certainement trouvé un bogue. C’est pour cela que cette erreur existe, qu’il s’agisse du compilateur C #, VB ou C ++. C’est le “Oh, s ** t, quelque chose a juste mal tourné inopinément!” erreur de rejeter nos mains et renflouer.

  2. Au-delà, il s’agit certainement d’un bogue du compilateur C # à signaler. Le code qui tombe en panne suppose que lorsque vous effectuez un initialiseur sur une propriété, il y a un getter qu’il peut examiner et, hé, devinez quoi? Dans ce cas, il n’y en a pas. Curieusement, si je change le type en cours de construction en un type “C” au lieu de “object”, je ne reçois pas le crash, alors je suppose que c’est un échec plus loin dans la stack (c’est à dire que le code n’aurait jamais dû être au point où il cherchait le getter de la propriété).

J’espère que cela t’aides.

C’est ce que j’ai trouvé en ligne lié à l’erreur,

Publié par Microsoft le 03/03/2010 à 10h58

Merci à tous pour les rapports. Je crois que ce problème a été résolu post-RC. Le problème est que le compilateur C # se bloque car il essaie de signaler une erreur ou un avertissement. Dans plusieurs cas, l’avertissement signalé est que la variable d’environnement LIB contient un chemin non valide. Pour éviter le blocage, vérifiez que votre variable d’environnement LIB contient des chemins valides.

Cordialement,

Ed Maurer Directeur du développement, Compilateurs VB et C #