Сбой компилятора С# 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
Ответы
Ответ 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);
}
}
Это также имеет то преимущество, что Церковь определяется везде, а не только как файл, использующий псевдоним.