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

Вы можете считать это отчетом об ошибке, однако мне любопытно, если я здесь ужасно неправ, или если есть объяснение от Эрика или кого-то еще в 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 { } }
}

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

Ответы [ 2 ]

8 голосов
/ 02 июля 2011

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

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

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

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

0 голосов
/ 24 июня 2011

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

Опубликовано Microsoft 3/9/2010 в 10:58

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

С уважением,

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

...