¿Error en el compilador de C#? La sintaxis del inicializador de objetos utilizada para la propiedad de solo escritura en la expresión hace que csc se bloquee


Puede considerar esto un informe de error, sin embargo, tengo curiosidad si estoy terriblemente equivocado aquí, o si hay una explicación de Eric o alguien más en Microsoft.

Actualizar

Esto ahora es publicado como un error en Microsoft Connect.

Descripción

Considere la siguiente clase:

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

Aquí, A.B es un solo escritura pero por lo demás propiedad fina.
Ahora, imagina que lo asignamos dentro de expresión :

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

Este código hace compilador de C #(ambos 3.5.30729.4926 y 4.0.30319.1) escupir

Error interno del compilador (0xc0000005 en la dirección 013E213F): el culpable probable es 'BIND'.

Y crash.

Sin embargo, simplemente reemplazando la sintaxis del inicializador de objetos ({ }) con un constructor (( )) compila bien.

Código completo para la reproducción:

using System;
using System.Linq.Expressions;

class Test {
    public static void Main()
    {
        Expression<Func<A>> expr = 
            () => new A {
                B = new object { }
            };
    }
}

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

(Y sí, I did hit trabajando en un proyecto real.)

Author: Dan Abramov, 2011-06-24

2 answers

Me temo que no soy Eric Lippert (Oh, pero podría ser tan apuesto...), pero como un antiguo chico de Visual Studio languages que todavía puede buscar en las fuentes, yo puedo decir dos cosas sobre esto:

  1. Cada vez que ves algo que comienza con "Error Interno del Compilador" definitivamente has encontrado un error. Para eso existe ese error, ya sea el compilador de C#, VB o C++. Es el " Oh, s * * t, algo salió realmente inesperadamente mal!" error de tirar-nuestras-manos-y-rescatar-fuera.

  2. Más allá de eso, este es definitivamente un error en el compilador de C# que debería ser reportado. El código que está fallando está asumiendo que cuando estás haciendo un inicializador en una propiedad que hay un getter que puede mirar y, oye, ¿adivina qué? En este caso, no lo hay. Curiosamente, si cambio el tipo que se está construyendo a algún tipo "C" en lugar de "object", no recibo el bloqueo, así que supongo que es un error más arriba de la pila (es decir, el código nunca debería haber llegado al punto en el que estaba buscando la propiedad getter).

Espero que esto ayude.

 8
Author: panopticoncentral,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-02 01:43:11

Esto es lo que encontré en línea relacionado con el error,

Publicado por Microsoft el 3/9/2010 a las 10: 58 AM

Gracias a todos por los informes. Me cree que este problema se ha solucionado post-RC. El problema es que la C# compilador está fallando, ya que trata de informe de un error o advertencia. En varios casos en los que hemos visto la advertencia reported is that the LIB environment la variable contiene una ruta no válida. A evite el accidente, compruebe que su LIB ambiente variable contiene válido caminos.

Saludos,

Ed Maurer Gerente de Desarrollo, VB y Compiladores de C#

 0
Author: Wicked Coder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-24 17:45:47