Ошибка компилятора С#? Синтаксис инициализатора синтаксиса, используемый для свойства write-only в Expression, приводит к сбою csc
Вы можете рассмотреть этот отчет об ошибке, однако мне любопытно, если я здесь ужасно не прав, или если есть объяснение от Эрика или кого-то еще в Microsoft.
Update
Теперь это размещено как ошибка в Microsoft Connect.
Описание
Рассмотрим следующий класс:
class A
{
public object B {
set { }
}
}
Здесь A.B
является только для записи, но в остальном это свойство отлично.
Теперь представьте, что мы назначим его внутри выражения:
Expression<Func<A>> expr =
() => new A {
B = new object { }
};
Этот код делает компилятор С# ( 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 { } }
}
(И да, я ударил его, работая над реальным проектом.)
Ответы
Ответ 1
Я боюсь, что я не Эрик Липперт (о, но могу ли я быть таким тихим...), но, как бывший парень из Visual Studio, который все еще может искать источники, могу сказать две вещи об этом:
-
Когда вы видите что-то, начинающееся с "Internal Compiler Error", вы определенно нашли ошибку. Для чего нужна эта ошибка, будь то компилятор С#, VB или С++. Это "О, s ** t, что-то просто неожиданно случилось!" Ошибка сброса-нашего-рук-и-спасения.
-
Кроме того, это определенно ошибка в компиляторе С#, о котором следует сообщить. Код, который разбивается, предполагает, что когда вы делаете инициализатор на свойстве, где есть геттер, на который он может смотреть, и, эй, угадайте, что? В этом случае нет. Как ни странно, если я изменил тип, который был сконструирован для некоторого типа "C" вместо "object", я не получаю аварийный сигнал, поэтому я предполагаю, что он больше не работает в стеке (т.е. код никогда не должен был получать вплоть до того момента, когда он искал свойство getter).
Надеюсь, что это поможет.
Ответ 2
Это то, что я нашел онлайн в связи с ошибкой,
Отправлено Microsoft от 03.09.2010 в 10:58
Спасибо всем за отчеты. я считают, что этот вопрос исправлен пост-RC. Проблема в том, что С# компилятор сбой, поскольку он пытается сообщите об ошибке или предупреждении. В нескольких случаев мы видели предупреждение сообщается, что среда LIB переменная содержит недопустимый путь. к избегайте краха, убедитесь, что ваша LIB переменная среды содержит действительные пути.
Привет,
Эд Маурер Менеджер по развитию, VB и Компиляторы С#