Błąd kompilatora C#? Składnia inicjalizatora obiektu używana dla właściwości tylko do zapisu w wyrażeniu powoduje awarię csc

Możesz uznać to za zgłoszenie błędu, jednak jestem ciekaw, czy bardzo się mylę, czy istnieje wyjaśnienie od Erica lub kogoś innego z Microsoftu.

Update

To jest teraz opublikowane jako błąd {[13] } w Microsoft Connect.

Opis

Rozważmy następującą klasę:

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

Tutaj, A.B jest Tylko do zapisu, ale poza tym dobra właściwość.
Wyobraźmy sobie, że przypisujemy go wewnątrz wyrażenie :

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

Ten kod tworzy kompilator C# (zarówno 3.5.30729.4926 i 4.0.30319.1) wypluć

Wewnętrzny błąd kompilatora (0xc0000005 pod adresem 013E213F): prawdopodobnym winowajcą jest 'BIND'.

I crash.

Jednakże jedynie zastąpienie składni inicjalizatora obiektu ({ }) konstruktorem (( )) kompiluje się dobrze.

Pełny kod do reprodukcji:

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

(and yes, Idid hit pracuje nad prawdziwym projektem.)

Author: Dan Abramov, 2011-06-24

2 answers

Obawiam się, że nie jestem Eric Lippert (Oh, ale czy mógłbym być taki Dziarski...), ale jako były Visual Studio languages guy, który nadal może szukać źródeł, ja Mogę powiedzieć dwie rzeczy na ten temat:

  1. Za każdym razem, gdy widzisz coś, co zaczyna się od "wewnętrznego błędu kompilatora", z pewnością znalazłeś błąd. Po to jest ten błąd, czy to kompilator C#, VB czy C++. To jest " OH, s * * T, coś poszło naprawdę nieoczekiwanie nie tak!" wyrzucamy-nasze-rączki-i-ratujemy-błąd.

  2. Poza tym jest to zdecydowanie błąd w kompilatorze C#, który należy zgłosić. Kod, który się zawiesza, zakłada, że kiedy robisz inicjalizator na nieruchomości, na której jest getter, może spojrzeć i, hej, zgadnij co? W tym przypadku nie ma. co dziwne, jeśli zmienię budowany typ na jakiś typ " C "zamiast " object", nie dostanę awarii, więc zgaduję, że jest to awaria dalej na stosie (tzn. kod nigdy nie powinien dostać się do punktu, w którym szukał własności getter).

Mam nadzieję, że to pomoże.

 8
Author: panopticoncentral,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-02 01:43:11

Oto co znalazłem w Internecie związane z błędem,

Posted by Microsoft on 3/9/2010 at 10: 58 AM

Dziękuję wszystkim za raporty. I uwierz, że ten problem został rozwiązany post-RC. Problem w tym, że C# kompilator się zawiesza, gdy próbuje Zgłoś błąd lub ostrzeżenie. W kilku przypadki, które widzieliśmy ostrzeżenie jest donoszono, że środowisko LIB zmienna zawiera nieprawidłową ścieżkę. Na unikaj katastrofy, sprawdź, czy Twoja LIB środowisko zmienna zawiera poprawny / align = "left" /

Pozdrawiam,

Ed Maurer Development Manager, VB and Kompilatory C #

 0
Author: Wicked Coder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-24 17:45:47