Ошибка компилятора C#? Синтаксис инициализатора объекта, используемый для свойства только для записи в Expression, приводит к сбою csc

Вы можете считать это отчетом об ошибке, однако мне любопытно, если я здесь ужасно ошибаюсь, или если есть объяснение от Эрика или кого-то еще в Microsoft.

Обновить

Теперь это опубликовано как ошибка в Microsoft Connect.

Описание

Рассмотрим следующий класс:

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

Вот, A.B свойство только для записи, но в остальном прекрасно.
Теперь представьте, что мы присваиваем это внутри выражения:

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

Этот код заставляет компилятор C# (как 3.5.30729.4926, так и 4.0.30319.1) выплевывать

Внутренняя ошибка компилятора (0xc0000005 по адресу 013E213F): вероятный виновник - "BIND".

и сбой.

Однако, просто заменив синтаксис инициализатора объекта ( { } ) с помощью конструктора ( ( ) ) компилируется просто отлично.

Полный код для воспроизведения:

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 { } }
}

(И да, я ударил его, работая над реальным проектом.)

2 ответа

Решение

Я боюсь, что я не Эрик Липперт (О, но мог бы я быть таким лихим...), но как бывший парень по языкам Visual Studio, который все еще может искать источники, я могу сказать по этому поводу две вещи:

  1. Каждый раз, когда вы видите что-то, что начинается с "Внутренняя ошибка компилятора", вы наверняка обнаружите ошибку. Вот для чего существует эта ошибка, будь то компилятор C#, VB или C++. Это "О, блин, что-то пошло действительно неожиданно неправильно!" ошибка "выбрасываем наши руки и спасаемся".

  2. Кроме того, это определенно ошибка в компиляторе C#, о которой следует сообщать. Код, который вылетает, предполагает, что когда вы выполняете инициализатор для свойства, есть геттер, на который оно может смотреть, и, эй, угадайте, что? В этом случае нет. Как ни странно, если я изменяю конструируемый тип на какой-то тип "С" вместо "объект", я не получаю сбой, так что я предполагаю, что это сбой дальше по стеку (то есть код никогда не должен был быть получен вплоть до точки, где он искал собственности добытчика).

Надеюсь это поможет.

Это то, что я нашел в Интернете, связанные с ошибкой,

Написал Microsoft 9 марта 2010 в 10:58

Спасибо всем за сообщения. Я считаю, что эта проблема была исправлена ​​после RC. Проблема в том, что компилятор C# падает, так как он пытается сообщить об ошибке или предупреждении. В нескольких случаях мы видели предупреждение о том, что переменная среды LIB содержит неверный путь. Чтобы избежать сбоя, убедитесь, что ваша переменная среды LIB содержит допустимые пути.

С Уважением,

Эд Маурер, менеджер по развитию, компиляторы VB и C#

Другие вопросы по тегам