Ошибка компилятора 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, который все еще может искать источники, я могу сказать по этому поводу две вещи:
Каждый раз, когда вы видите что-то, что начинается с "Внутренняя ошибка компилятора", вы наверняка обнаружите ошибку. Вот для чего существует эта ошибка, будь то компилятор C#, VB или C++. Это "О, блин, что-то пошло действительно неожиданно неправильно!" ошибка "выбрасываем наши руки и спасаемся".
Кроме того, это определенно ошибка в компиляторе C#, о которой следует сообщать. Код, который вылетает, предполагает, что когда вы выполняете инициализатор для свойства, есть геттер, на который оно может смотреть, и, эй, угадайте, что? В этом случае нет. Как ни странно, если я изменяю конструируемый тип на какой-то тип "С" вместо "объект", я не получаю сбой, так что я предполагаю, что это сбой дальше по стеку (то есть код никогда не должен был быть получен вплоть до точки, где он искал собственности добытчика).
Надеюсь это поможет.
Это то, что я нашел в Интернете, связанные с ошибкой,
Написал Microsoft 9 марта 2010 в 10:58
Спасибо всем за сообщения. Я считаю, что эта проблема была исправлена после RC. Проблема в том, что компилятор C# падает, так как он пытается сообщить об ошибке или предупреждении. В нескольких случаях мы видели предупреждение о том, что переменная среды LIB содержит неверный путь. Чтобы избежать сбоя, убедитесь, что ваша переменная среды LIB содержит допустимые пути.
С Уважением,
Эд Маурер, менеджер по развитию, компиляторы VB и C#