Ошибка компилятора С#? Синтаксис инициализатора синтаксиса, используемый для свойства 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 и Компиляторы С#