Сбой компилятора C # 4.0 - PullRequest
50 голосов
/ 25 октября 2011

Этот пример кода не может быть скомпилирован. Есть какая-нибудь работа вокруг?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    using church = Func<dynamic, dynamic, dynamic>;

    class Program
    {
        static void Main(string[] args)
        {
            church True = (a, b) => a;
            church False = (a, b) => b;

            Func<church, church, church> And = (x, y) => x(y(True, False), False);
        }
    }
}

Ошибка 6 Внутренняя ошибка компилятора (0xc0000005 по адресу 5476A4CC): вероятный виновник - «EMITIL». Произошла внутренняя ошибка в компиляторе. Чтобы обойти эту проблему, попробуйте упростить или изменить программу рядом с местами, перечисленными ниже. Расположение вверху списка ближе к точке, в которой произошла внутренняя ошибка. О таких ошибках можно сообщить в Microsoft с помощью параметра / errorreport. TestApplication

Ответы [ 4 ]

49 голосов
/ 26 октября 2011

Очевидно, что это ошибка компилятора.

Я упомянул об этом одному из наших тестеров, и он сказал:

Я рад сообщить, что это уже исправлено, и вы увидите это исправление в следующей версии.ВСВы также увидите исправление в BUILD Developer Preview для Visual Studio!

Извиняюсь за ошибку, и спасибо за то, что обратили на это наше внимание.

27 голосов
/ 25 октября 2011

Я воспроизвел сбой, используя VS2010 (WinXP 64).

Два обходных пути:

1.не используйте using псевдоним

Следующий код корректно компилируется на VS2010:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Func<dynamic, dynamic, dynamic> True = (a, b) => a;
            Func<dynamic, dynamic, dynamic> False = (a, b) => b;

            Func<Func<dynamic, dynamic, dynamic>, 
                 Func<dynamic, dynamic, dynamic>,
                 Func<dynamic, dynamic, dynamic> > And 
                = (x, y) => x(y(True, False), False);
        }
    }
}

2.используйте компилятор Mono

Нет проблем с компилятором Mono 2.10 (dmcs).

[mono] /tmp @ dmcs test.cs
test.cs(18,42): warning CS0219: The variable `And' is assigned but its value is never used
Compilation succeeded - 1 warning(s)
[mono] /tmp @ ./test.exe 
[mono] /tmp @ 

Это было проверено на Linux.

  1. Вы можете запускать двоичные файлы, созданные с помощью mono, в Windows .NET.
  2. Моно-компилятор поставляется с установщиком MSI и также работает в Windows.
21 голосов
/ 25 октября 2011

РЕДАКТИРОВАТЬ: теперь мне удалось воспроизвести его, и У меня есть потенциальный обходной путь.

Это работает:

csc Test.cs

Это не:

csc /debug+ Test.cs

Похоже, это проблема с отладочной информацией. Если вы можете жить без этого в вашем конкретном сценарии, вы можете идти ...

РЕДАКТИРОВАТЬ: Я только что проверил, и это также происходит с /debug:pdbonly ...

РЕДАКТИРОВАТЬ: На всякий случай, если кому-то интересно, я буду пинговать Эрика Липперта об этом.

РЕДАКТИРОВАТЬ: Теперь это минимальное воспроизведение, которое я нашел:

using church = System.Func<dynamic>;

class Program
{
    static void Main() {}
}
14 голосов
/ 26 октября 2011

Вот еще один обходной путь: не используйте Func, используйте старый добрый тип делегата.

public delegate dynamic Church(dynamic x, dynamic y);

class Program {
    static void Main(string[] args) {
        Church True = (a, b) => a;
        Church False = (a, b) => b;

        Func<Church, Church, Church> And = (x, y) => x(y(True, False), False);
    }
}

Это также имеет то преимущество, что Церковь определяется везде, а не только какфайл с использованием псевдонима.

...