Подтвердить что ты не робот

Сбой компилятора С# 4.0

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

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

4b9b3361

Ответ 1

Я воспроизвел сбой с помощью 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.

  • Вы можете запускать исполняемые файлы, созданные с помощью моно в Windows.NET.
  • Монокомпилятор поставляется с установщиком MSI и работает в Windows.

Ответ 2

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

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

Я рад сообщить, что это уже исправлено, и вы увидите это исправление в следующей версии VS. На самом деле вы увидите, что он исправлен в предварительном представлении разработчика BUILD для Visual Studio!

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

Ответ 3

EDIT: мне удалось воспроизвести его, и у меня есть потенциальное решение.

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

csc Test.cs

Это не означает:

csc /debug+ Test.cs

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

EDIT: я только что проверил, и это происходит и с /debug:pdbonly...

EDIT: На всякий случай кто-то задавался вопросом, я буду пинговать Эрика Липперта об этом.

EDIT: теперь это минимальный реестр, который я нашел:

using church = System.Func<dynamic>;

class Program
{
    static void Main() {}
}

Ответ 4

Вот еще один способ: не используйте 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);
    }
}

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